<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