RFR: 8327429: String Template FMT built-in optimization for DateTimes

Jaikiran Pai jpai at openjdk.org
Wed Mar 6 04:53:01 UTC 2024


On Wed, 4 Oct 2023 22:30:42 GMT, Shaojin Wen <duke at openjdk.org> wrote:

> # Goal
> Improve String Template FMT's processing performance of date types. Currently, FMT processes date types by toString and then calls j.u.Formatter#print. Because there is less parse processing than String.format, the performance is improved, but it is still not good enough. There is an intermediate String object allocation, and the print performance of j.u.Formatter is not as good as The StringConcat.prepend method is great.
> 
> This patch allows String Template FMT to handle Date/Instant/LocalDate/LocalTime/LocalDateTime/OffsetTime/OffsetDateTime/ZonedDateTime/Instant types with optimization, just like int/long/float/double/String.
> 
> # Optimized type and Specifier combinations
> * java.util.Date
> 
> %s
> %tc (Sat Nov 04 12:02:33 EST 1999)
> %tD DATE (mm/dd/yy)
> %tF ISO_STANDARD_DATE (%Y-%m-%d)
> %tT TIME (24 hour hh:mm:ss)
> %tR TIME_24_HOUR hh:mm same as %H:%M
> %tr TIME_12_HOUR (hh:mm:ss [AP]M)
> 
> 
> * LocalDate
> 
> %s
> %tD DATE (mm/dd/yy)
> %tF ISO_STANDARD_DATE (%Y-%m-%d)
> 
> 
> * LocalDateTime
> 
> %s
> %tD DATE (mm/dd/yy)
> %tF ISO_STANDARD_DATE (%Y-%m-%d)
> %tT TIME (24 hour hh:mm:ss)
> %tR TIME_24_HOUR hh:mm same as %H:%M
> %tr TIME_12_HOUR (hh:mm:ss [AP]M)
> 
> 
> * OffsetDateTime
> 
> %s
> %tD DATE (mm/dd/yy)
> %tF ISO_STANDARD_DATE (%Y-%m-%d)
> %tT TIME (24 hour hh:mm:ss)
> %tR TIME_24_HOUR hh:mm same as %H:%M
> %tr TIME_12_HOUR (hh:mm:ss [AP]M)
> 
> 
> * ZonedDateTime
> 
> %s
> %tD DATE (mm/dd/yy)
> %tF ISO_STANDARD_DATE (%Y-%m-%d)
> %tT TIME (24 hour hh:mm:ss)
> %tR TIME_24_HOUR hh:mm same as %H:%M
> %tr TIME_12_HOUR (hh:mm:ss [AP]M)
> 
> 
> * LocalTime
> 
> %s
> %tT TIME (24 hour hh:mm:ss)
> %tR TIME_24_HOUR hh:mm same as %H:%M
> %tr TIME_12_HOUR (hh:mm:ss [AP]M)
> 
> 
> * OffsetTime
> 
> %s
> %tT TIME (24 hour hh:mm:ss)
> %tR TIME_24_HOUR hh:mm same as %H:%M
> %tr TIME_12_HOUR (hh:mm:ss [AP]M)
> 
> 
> * Instant
> 
> %s
> 
> 
> # Performance Numbers
> run on MacBook M1 Pro
> 
> -Benchmark                               Mode  Cnt    Score   Error  Units (baseline)
> -StringTemplateFMT.dateFormat            avgt   15   66.601 ? 0.863  ns/op
> -StringTemplateFMT.instantFormat         avgt   15  198.284 ? 5.804  ns/op
> -StringTemplateFMT.ldtFormat             avgt   15  103.625 ? 6.315  ns/op
> -StringTemplateFMT.localTimeFormat       avgt   15   44.750 ? 0.219  ns/op
> -StringTemplateFMT.zdtFormat             avgt   15  179.140 ? 8.379  ns/op
> 
> +Benchmark                               Mode  Cnt    Score    Error  Units (optimized)
> +StringTemplateFMT.dateFormat            avgt   15   29.425 ?  0.510  ns/op (+126.35)
> +StringTemplateFMT.instantFormat         avgt   15   36.467 ?  0.114  ns/op ...

Hello @wenshao, it's better to create a mailing list discussion https://openjdk.org/guide/#socialize-your-change before opening a PR for a change like this. core-libs-dev will be the right mailing list for this discussion https://mail.openjdk.org/mailman/listinfo/core-libs-dev. That way, it gets better attention and guidance on how to proceed.

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

PR Comment: https://git.openjdk.org/jdk/pull/16044#issuecomment-1951820602


More information about the core-libs-dev mailing list