<i18n dev> RFR: 8349189: Speed up DateTime parse & format via Class File API

Shaojin Wen swen at openjdk.org
Sun Feb 2 17:37:43 UTC 2025


On Fri, 31 Jan 2025 10:29:53 GMT, Shaojin Wen <swen at openjdk.org> wrote:

> By using the Class File API to dynamically generate a CompositePrinterParser, and defining DateTimePrinterParser[] printerParsers as a specific field, C2 can do TypeProfile optimization.
> 
> Since the CompositePrinterParser is generated based on the pattern, we can make the following optimizations:
> 
> 1. For example, for the parse and print of Month/DayOfMonth/Hour/Minute/Second with a fixed length of 2, do targeted parse and print optimization.
> 
> 2. Parse uses LocalDate/LocalTime/LocalDateTime/OffsetDateTime for TemporalQuery to avoid the overhead of constructing DateTimeParseContext.
> 
> These optimizations can significantly improve performance, with more than 100% performance improvement in many scenarios.

Below are the performance numbers on the MacBook M1, which show very significant performance improvements in both parse and format scenarios. Many scenarios have an improvement of more than 100%, and in parse, some scenarios have a performance improvement of more than 10 times.

# 1. Script

git remote add wenshao git at github.com:wenshao/jdk.git
git fetch wenshao

#baseline
git checkout 75caf4f7c6acf04d4acbe6434ecdc9ce9a6b35d7
make test TEST="micro:java.time.format.DateTimeFormatterParse"
make test TEST="micro:java.time.format.DateTimeFormatterBench"

# current
git checkout 55ac19d6dfc401d66bb141ada501945b8145c62e
make test TEST="micro:java.time.format.DateTimeFormatterParse"
make test TEST="micro:java.time.format.DateTimeFormatterBench"



# 2. the performance benchmarks on MacBook M1 Pro



-# baseline
-Benchmark                                                   (pattern)   Mode  Cnt   Score   Error   Units (c49dd5b8efd)
-DateTimeFormatterBench.formatInstants                        HH:mm:ss  thrpt   15  16.326 ? 0.440  ops/ms
-DateTimeFormatterBench.formatInstants                    HH:mm:ss.SSS  thrpt   15  10.870 ? 0.080  ops/ms
-DateTimeFormatterBench.formatInstants           yyyy-MM-dd'T'HH:mm:ss  thrpt   15   9.187 ? 0.374  ops/ms
-DateTimeFormatterBench.formatInstants       yyyy-MM-dd'T'HH:mm:ss.SSS  thrpt   15   7.086 ? 0.235  ops/ms
-DateTimeFormatterBench.formatZonedDateTime                   HH:mm:ss  thrpt   15  23.344 ? 0.297  ops/ms
-DateTimeFormatterBench.formatZonedDateTime               HH:mm:ss.SSS  thrpt   15  16.015 ? 0.198  ops/ms
-DateTimeFormatterBench.formatZonedDateTime      yyyy-MM-dd'T'HH:mm:ss  thrpt   15  13.561 ? 0.527  ops/ms
-DateTimeFormatterBench.formatZonedDateTime  yyyy-MM-dd'T'HH:mm:ss.SSS  thrpt   15  10.241 ? 0.055  ops/ms

+# current
+Benchmark                                                   (pattern)   Mode  Cnt    Score   Error   Units (55ac19d6dfc)
+DateTimeFormatterBench.formatInstants                        HH:mm:ss  thrpt   15   44.066 ? 0.526  ops/ms
+DateTimeFormatterBench.formatInstants                    HH:mm:ss.SSS  thrpt   15   31.789 ? 0.124  ops/ms
+DateTimeFormatterBench.formatInstants           yyyy-MM-dd'T'HH:mm:ss  thrpt   15   29.527 ? 0.090  ops/ms
+DateTimeFormatterBench.formatInstants       yyyy-MM-dd'T'HH:mm:ss.SSS  thrpt   15   23.733 ? 0.083  ops/ms
+DateTimeFormatterBench.formatZonedDateTime                   HH:mm:ss  thrpt   15  116.871 ? 1.173  ops/ms
+DateTimeFormatterBench.formatZonedDateTime               HH:mm:ss.SSS  thrpt   15   75.032 ? 0.321  ops/ms
+DateTimeFormatterBench.formatZonedDateTime      yyyy-MM-dd'T'HH:mm:ss  thrpt   15   64.843 ? 0.633  ops/ms
+DateTimeFormatterBench.formatZonedDateTime  yyyy-MM-dd'T'HH:mm:ss.SSS  thrpt   15   49.958 ? 0.511  ops/ms


|   | pattern | baseline  | current | delta |
| --- | --- | --- | --- | --- |
| DateTimeFormatterBench.formatInstants | HH:mm:ss | 16.326 | 44.066 | 169.91% |
| DateTimeFormatterBench.formatInstants | HH:mm:ss.SSS | 10.870 | 31.789 | 192.45% |
| DateTimeFormatterBench.formatInstants | yyyy-MM-dd'T'HH:mm:ss | 9.187 | 29.527 | 221.40% |
| DateTimeFormatterBench.formatInstants | yyyy-MM-dd'T'HH:mm:ss.SSS | 7.086 | 23.733 | 234.93% |
| DateTimeFormatterBench.formatZonedDateTime | HH:mm:ss | 23.344 | 116.871 | 400.65% |
| DateTimeFormatterBench.formatZonedDateTime | HH:mm:ss.SSS | 16.015 | 75.032 | 368.51% |
| DateTimeFormatterBench.formatZonedDateTime | yyyy-MM-dd'T'HH:mm:ss | 13.561 | 64.843 | 378.16% |
| DateTimeFormatterBench.formatZonedDateTime | yyyy-MM-dd'T'HH:mm:ss.SSS | 10.241 | 49.958 | 387.82% |



-# baseline
-Benchmark                                           Mode  Cnt     Score      Error   Units (c49dd5b8efd)
-DateTimeFormatterParse.parseInstant                thrpt   15  2271.484 ?  114.069  ops/ms
-DateTimeFormatterParse.parseLocalDate              thrpt   15  6729.739 ? 1800.372  ops/ms
-DateTimeFormatterParse.parseLocalDateTime          thrpt   15  4224.068 ?  153.198  ops/ms
-DateTimeFormatterParse.parseLocalDateTimeWithNano  thrpt   15  4180.456 ?   82.478  ops/ms
-DateTimeFormatterParse.parseLocalTime              thrpt   15  4908.282 ?  208.797  ops/ms
-DateTimeFormatterParse.parseLocalTimeWithNano      thrpt   15  5412.657 ?  133.999  ops/ms
-DateTimeFormatterParse.parseOffsetDateTime         thrpt   15  2788.254 ?   85.754  ops/ms
-DateTimeFormatterParse.parseZonedDateTime          thrpt   15  2032.773 ?   78.660  ops/ms

+# current
+Benchmark                                           Mode  Cnt       Score       Error   Units (55ac19d6dfc)
+DateTimeFormatterParse.parseInstant                thrpt   15    3645.826 ?    53.758  ops/ms
+DateTimeFormatterParse.parseLocalDate              thrpt   15   57592.249 ?  3711.524  ops/ms
+DateTimeFormatterParse.parseLocalDateTime          thrpt   15   24713.840 ?  1462.137  ops/ms
+DateTimeFormatterParse.parseLocalDateTimeWithNano  thrpt   15   15246.892 ?   960.591  ops/ms
+DateTimeFormatterParse.parseLocalTime              thrpt   15  115757.021 ? 15040.874  ops/ms
+DateTimeFormatterParse.parseLocalTimeWithNano      thrpt   15   64888.840 ?   297.881  ops/ms
+DateTimeFormatterParse.parseOffsetDateTime         thrpt   15   15789.014 ?   188.675  ops/ms
+DateTimeFormatterParse.parseZonedDateTime          thrpt   15    2313.851 ?    61.707  ops/ms


|   | baseline  | current | delta |
| --- | --- | --- | --- |
| DateTimeFormatterParse.parseInstant | 2271.484 | 3645.826 | 60.50% |
| DateTimeFormatterParse.parseLocalDate | 6729.739 | 57592.249 | 755.79% |
| DateTimeFormatterParse.parseLocalDateTime | 4224.068 | 24713.840 | 485.07% |
| DateTimeFormatterParse.parseLocalDateTimeWithNano | 4180.456 | 15246.892 | 264.72% |
| DateTimeFormatterParse.parseLocalTime | 4908.282 | 115757.021 | 2258.40% |
| DateTimeFormatterParse.parseLocalTimeWithNano | 5412.657 | 64888.840 | 1098.84% |
| DateTimeFormatterParse.parseOffsetDateTime | 2788.254 | 15789.014 | 466.27% |
| DateTimeFormatterParse.parseZonedDateTime | 2032.773 | 2313.851 | 13.83% |

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

PR Comment: https://git.openjdk.org/jdk/pull/23384#issuecomment-2629267435


More information about the i18n-dev mailing list