On Mon, 24 Nov 2025 08:02:35 GMT, Shaojin Wen <[email protected]> wrote:

> This PR optimizes the parsing performance of DateTimeFormatter by replacing 
> HashMap with EnumMap in scenarios where the keys are exclusively ChronoField 
> enum values.
> 
> When parsing date/time strings, DateTimeFormatter creates HashMaps to store 
> intermediate parsed values. HashMap has more overhead for operations compared 
> to specialized map implementations.
> 
> Since ChronoField is an enum and all keys in these maps are ChronoField 
> instances, we can use EnumMap instead, which provides better performance for 
> enum keys due to its optimized internal structure.
> 
> Parsing scenarios show improvements from 12% to 95%

# 1. Shell
We run the following Shell command

# master
git checkout b6495573e9dc5470df268b63f8e7a93f38406cd2
make test TEST="micro:java.time.format.DateTimeFormatterParse"

# this pr
git checkout d8742d7514abfe0e36f105fa7310fdb1755ae546
make test TEST="micro:java.time.format.DateTimeFormatterParse"



# 2. Raw Benchmark Data

Performance data running on a MacBook M1 Pro:


# b649557 (master)
Benchmark                                           Mode  Cnt     Score     
Error   Units
DateTimeFormatterParse.parseInstant                thrpt   15  2066.130 ± 
126.134  ops/ms
DateTimeFormatterParse.parseLocalDate              thrpt   15  5014.987 ± 
424.759  ops/ms
DateTimeFormatterParse.parseLocalDateTime          thrpt   15  3821.083 ± 
390.928  ops/ms
DateTimeFormatterParse.parseLocalDateTimeWithNano  thrpt   15  3529.090 ± 
209.195  ops/ms
DateTimeFormatterParse.parseLocalTime              thrpt   15  4275.904 ± 
335.752  ops/ms
DateTimeFormatterParse.parseLocalTimeWithNano      thrpt   15  4596.255 ± 
195.175  ops/ms
DateTimeFormatterParse.parseOffsetDateTime         thrpt   15  2330.924 ± 
152.061  ops/ms
DateTimeFormatterParse.parseZonedDateTime          thrpt   15  1837.753 ± 
107.873  ops/ms

# d8742d7 (this pr)
Benchmark                                           Mode  Cnt     Score     
Error   Units
DateTimeFormatterParse.parseInstant                thrpt   15  2900.168 ±  
56.079  ops/ms
DateTimeFormatterParse.parseLocalDate              thrpt   15  9787.592 ± 
384.437  ops/ms
DateTimeFormatterParse.parseLocalDateTime          thrpt   15  5046.838 ± 
271.451  ops/ms
DateTimeFormatterParse.parseLocalDateTimeWithNano  thrpt   15  3963.050 ± 
434.662  ops/ms
DateTimeFormatterParse.parseLocalTime              thrpt   15  8196.707 ± 
329.547  ops/ms
DateTimeFormatterParse.parseLocalTimeWithNano      thrpt   15  8387.213 ± 
652.292  ops/ms
DateTimeFormatterParse.parseOffsetDateTime         thrpt   15  3291.076 ± 
294.889  ops/ms
DateTimeFormatterParse.parseZonedDateTime          thrpt   15  2069.595 ± 
293.385  ops/ms


# 3. Performance Comparison


Performance Comparison: b6495573e9dc5470df268b63f8e7a93f38406cd2 vs 
d8742d7514abfe0e36f105fa7310fdb1755ae546

| Benchmark | b6495573e9dc5470df268b63f8e7a93f38406cd2 | 
d8742d7514abfe0e36f105fa7310fdb1755ae546 | Improvement Factor |
| --- | --- | --- | --- |
| DateTimeFormatterParse.parseInstant | 2066.130 ± 126.134 | 2900.168 ± 56.079 
| 1.404x |
| DateTimeFormatterParse.parseLocalDate | 5014.987 ± 424.759 | 9787.592 ± 
384.437 | 1.952x |
| DateTimeFormatterParse.parseLocalDateTime | 3821.083 ± 390.928 | 5046.838 ± 
271.451 | 1.321x |
| DateTimeFormatterParse.parseLocalDateTimeWithNano | 3529.090 ± 209.195 | 
3963.050 ± 434.662 | 1.123x |
| DateTimeFormatterParse.parseLocalTime | 4275.904 ± 335.752 | 8196.707 ± 
329.547 | 1.919x |
| DateTimeFormatterParse.parseLocalTimeWithNano | 4596.255 ± 195.175 | 8387.213 
± 652.292 | 1.825x |
| DateTimeFormatterParse.parseOffsetDateTime | 2330.924 ± 152.061 | 3291.076 ± 
294.889 | 1.412x |
| DateTimeFormatterParse.parseZonedDateTime | 1837.753 ± 107.873 | 2069.595 ± 
293.385 | 1.126x |

java/time/tck/java/time/temporal/TCKWeekFields.java
java/time/tck/java/time/temporal/TCKIsoFields.java
java/time/tck/java/time/temporal/TCKJulianFields.java
java/time/tck/java/time/format/TCKDateTimeParseResolver.java
java/time/tck/java/time/format/TCKLocalizedFieldParser.java
java/time/tck/java/time/format/TCKDateTimeFormatters.java
java/time/tck/java/time/format/TCKDateTimeFormatterBuilder.java

The existing tests above can cover the cases where there are no 
non-ChronoFields, so no additional tests are needed.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/28471#issuecomment-3571582110
PR Comment: https://git.openjdk.org/jdk/pull/28471#issuecomment-3573936930

Reply via email to