<i18n dev> RFR: 8276220: Reduce excessive allocations in DateTimeFormatter [v3]

Claes Redestad redestad at openjdk.java.net
Tue Nov 2 11:07:09 UTC 2021


On Tue, 2 Nov 2021 07:31:09 GMT, Stephen Colebourne <scolebourne at openjdk.org> wrote:

>> I see what you're saying that an arbitrary `Temporal` could define its own fields with its own ranges, but I would consider it a design bug if such an implementation at a whim redefines the value ranges of well-defined constants such as `ChronoField.NANO_OF_SECOND` or `HOUR_OF_DAY`. I'd expect such a `Temporal` would have to define its own enumeration of allowed `TemporalField`s.
>
> That isn't the design model however. The design model for the formatter is a `Map` like view of field to value. Any value may be associated with any field - that is exactly what `Temporal` offers. [`TempralAccessor.getLong()`](https://download.java.net/java/early_access/loom/docs/api/java.base/java/time/temporal/TemporalAccessor.html#getLong(java.time.temporal.TemporalField)) is very explicit about this.
> 
> As indicated above, the positive part is that an hour-of-day of 26 can be printed by a user-written `WrappingLocalTime` class. The downside is the inability to make optimizing assumptions as per this code.
> 
> FWIW, I had originally intended to write dedicated private formatters where the pattern and type to be formatted are known, such as `LocalDate` and the ISO pattern.

Ok, I've added a fallback to instantiate and use an instance of `FractionPrinterParser` when the value is outside of the range. This has a negligible negative effect on performance in the provided micro-benchmarks. Does this resolve your concerns?

I think dedicated private formatters is still a good idea, but I wanted to take a stab (like this) at improving common patterns in the shared code first.

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

PR: https://git.openjdk.java.net/jdk/pull/6188


More information about the i18n-dev mailing list