RFR: 8316235: Optimization for DateTimeFormatter::format
温绍锦
duke at openjdk.org
Thu Sep 14 02:21:14 UTC 2023
On Wed, 13 Sep 2023 18:52:21 GMT, ExE Boss <duke at openjdk.org> wrote:
>> In many scenarios, DateTimeFormatter::format is a slower operation.
>>
>> For example, the following business scenarios
>> 1. The json library gson/jackson/[fastjson2](https://github.com/alibaba/fastjson2) formats Instant/LocalDate/LocalTime/LocalDateTime/ZonedDateTim into strings.
>> 2. In data integration scenarios, for projects like [datax](https://github.com/alibaba/datax)/[canal](https://github.com/alibaba/canal), if the input type is Date/Instant and the output type is String, formatting is required.
>>
>> This PR provides format performance optimization for commonly used date patterns.
>>
>> ISO_INSTANT
>> ISO_LOCAL_TIME
>> ISO_LOCAL_DATE
>> ISO_LOCAL_DATETIME
>> HH:mm:ss
>> HH:mm:ss.SSS
>> yyyy-MM-dd
>> yyyy-MM-dd HH:mm:ss
>> yyyy-MM-dd'T'HH:mm:ss
>> yyyy-MM-dd HH:mm:ss.SSS
>> yyyy-MM-dd'T'HH:mm:ss.SSS
>
> src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java line 2661:
>
>> 2659: } else {
>> 2660: return super.format(context, buf);
>> 2661: }
>
> This can use `instanceof <pattern>`:
> Suggestion:
>
> if (temporal instanceof LocalTime lt) {
> time = lt;
> } else if (temporal instanceof LocalDateTime ldt) {
> time = ldt.toLocalTime();
> } else if (temporal instanceof ZonedDateTime zdt) {
> time = zdt.toLocalTime();
> } else if (temporal instanceof OffsetDateTime odt) {
> time = odt.toLocalTime();
> } else if (temporal instanceof OffsetTime ot) {
> time = ot.toLocalTime();
> } else {
> return super.format(context, buf);
> }
>
>
> Or even a pattern switch:
> Suggestion:
>
> switch (temporal) {
> case LocalTime lt -> time = lt;
> case LocalDateTime ldt -> time = ldt.toLocalTime();
> case ZonedDateTime zdt -> time = zdt.toLocalTime();
> case OffsetDateTime odt -> time = odt.toLocalTime();
> case OffsetTime ot -> time = ot.toLocalTime();
> default -> {
> return super.format(context, buf);
> }
> }
It's a good idea to use the new switch syntax
> src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java line 2683:
>
>> 2681: * Composite printer and parser.
>> 2682: */
>> 2683: static class CompositePrinterParser implements DateTimePrinterParser {
>
> This class can be `sealed`:
> Suggestion:
>
> static sealed class CompositePrinterParser implements DateTimePrinterParser {
Changes have been made based on your suggestions
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/15722#discussion_r1325113374
PR Review Comment: https://git.openjdk.org/jdk/pull/15722#discussion_r1325112780
More information about the core-libs-dev
mailing list