RFR: 8304976: Optimize DateTimeFormatterBuilder.ZoneTextPrinterParser.getTree()

Sergey Tsypanov stsypanov at openjdk.org
Mon Mar 27 16:27:18 UTC 2023


1) When `DateTimeFormatter` is reused we don't need to copy `availableZoneIds` and allocate `nonRegionIds` as PrefixTree can be taken from cache. In the related benchmark allocation of `HashSet` takes ~93% of all time, so avoiding it should bring some improvement for cases when we reuse `DateTimeFormatter` to parse a string into `ZoneDateTime`
![image](https://user-images.githubusercontent.com/10835776/219609028-af48eae4-d326-4719-8366-c215baa85835.png)

2) `DateTimeFormatter` is mostly used with one locale, so `cachedTree` and `cachedTreeCI` can have predefined size.


@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class DateTimeFormatterBenchmark {

    private static final DateTimeFormatter df = new DateTimeFormatterBuilder().appendPattern("yyyy:MM:dd:HH:mm:v").toFormatter();
    private static final String TEXT = "2015:03:10:12:13:ECT";

    @Setup
    public void setUp() {
        ZonedDateTime.parse(TEXT, df);
    }

    @Benchmark
    public ZonedDateTime parse() {
        return ZonedDateTime.parse(TEXT, df);
    }
}

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

Commit messages:
 - Revert irrelevant
 - Revert irrelevant
 - Measure average time
 - Delete duplicated
 - Merge branch 'master' into date-time-formatter-build
 - Add benchmark
 - Add JavaDoc and imports
 - Optimize DateTimeFormatterBuilder

Changes: https://git.openjdk.org/jdk/pull/12612/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=12612&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8304976
  Stats: 62 lines in 2 files changed: 57 ins; 1 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/12612.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/12612/head:pull/12612

PR: https://git.openjdk.org/jdk/pull/12612


More information about the core-libs-dev mailing list