RFR: 8315999: Improve Date toString performance
Claes Redestad
redestad at openjdk.org
Mon Sep 11 13:58:41 UTC 2023
On Mon, 11 Sep 2023 12:12:17 GMT, 温绍锦 <duke at openjdk.org> wrote:
> improve date toString performance, includes:
>
> java.util.Date.toString
> java.util.Date.toGMTString
> java.time.Instant.toString
> java.time.LocalDate.toString
> java.time.LocalDateTime.toString
> java.time.LocalTime.toString
As @liach says this should be done on top of #15651. As it stands now a thorough reviews seems a bit premature.
Correct me if I'm wrong but the gains come from inlining code into the various `toString` methods to reduce need to go through `DateTimeFormatter`s - which allocate `StringBuilder` and might go through chains of `CompositePrinterParser` and such.. It seems that before inlining and duplicating logic - making the code overall more fragile and harder to maintain - that we ought to see if we can get close enough by optimizing `DateTimeFormatter` and the corresponding builders to produce types that may optimize better.
src/java.base/share/classes/java/time/Instant.java line 1355:
> 1353: @Override
> 1354: public String toString() {
> 1355: return DateTimeFormatter.ISO_INSTANT.format(this);
Have you considered potentially more generalizable optimizations to `DateTimeFormatter.ISO_INSTANT.format(this)` here?
Hand-rolling a fixed-length buffer, skipping the `StringBuilder` .. understandably this can have a performance edge, but perhaps a `DateTimeFormatter` like `ISO_INSTANT` can be optimized to get closer to whatever speed-up this gets you - with broader implications.
src/java.base/share/classes/java/time/LocalDate.java line 2181:
> 2179: if (yearAbs < 1000) {
> 2180: if (year < 0) {
> 2181: buf[off] = '-';
`buf[off++] = '-';`
src/java.base/share/classes/java/time/LocalDate.java line 2188:
> 2186: ByteArrayLittleEndian.setInt(
> 2187: buf,
> 2188: year < 0 ? 1 : 0,
`off,`
src/java.base/share/classes/java/time/LocalDate.java line 2192:
> 2190: } else {
> 2191: if (year > 9999) {
> 2192: buf[off] = '+';
`buf[off++] = '+';`?
-------------
PR Review: https://git.openjdk.org/jdk/pull/15658#pullrequestreview-1620003157
PR Review Comment: https://git.openjdk.org/jdk/pull/15658#discussion_r1321554515
PR Review Comment: https://git.openjdk.org/jdk/pull/15658#discussion_r1321590202
PR Review Comment: https://git.openjdk.org/jdk/pull/15658#discussion_r1321591620
PR Review Comment: https://git.openjdk.org/jdk/pull/15658#discussion_r1321588790
More information about the core-libs-dev
mailing list