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` 
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