[jdk17u-dev] RFR: 8304976: Optimize DateTimeFormatterBuilder.ZoneTextPrinterParser.getTree()

Oli Gillespie ogillespie at openjdk.org
Thu Jun 1 11:32:06 UTC 2023


On Thu, 1 Jun 2023 09:02:44 GMT, Oli Gillespie <ogillespie at openjdk.org> wrote:

> Hi all,
> 
> This pull request contains a backport of commit [438c969b](https://github.com/openjdk/jdk/commit/438c969b7b07eeef0158b089e5a168849e04bf56) from the [openjdk/jdk](https://git.openjdk.org/jdk) repository.
> 
> The commit being backported was authored by Sergey Tsypanov on 29 Mar 2023 and was reviewed by Naoto Sato.
> 
> Since the original uses the new `newHashMap` and `newHashSet` methods from https://bugs.openjdk.org/browse/JDK-8284780 which are not here in 17, I've not included those changes in the backport. They are not a significant part of the original fix, the main point of the change is kept which is avoiding the creation of 2 new hash sets on the cached path. Running the included benchmark confirms the performance improvement even with the omissions:
> 
> Base:
> 
> Benchmark                                                  Mode  Cnt      Score     Error   Units
> ZonedDateTimeFormatterBenchmark.parse                      avgt   20  18248.082 ? 166.440   ns/op
> ZonedDateTimeFormatterBenchmark.parse:?gc.alloc.rate       avgt   20   1274.964 ?  11.448  MB/sec
> ZonedDateTimeFormatterBenchmark.parse:?gc.alloc.rate.norm  avgt   20  24400.418 ?   1.591    B/op
> ZonedDateTimeFormatterBenchmark.parse:?gc.count            avgt   20     44.000            counts
> ZonedDateTimeFormatterBenchmark.parse:?gc.time             avgt   20     35.000                ms
> 
> 
> Patch:
> 
> Benchmark                                                  Mode  Cnt    Score   Error   Units
> ZonedDateTimeFormatterBenchmark.parse                      avgt   20  923.943 ? 8.737   ns/op
> ZonedDateTimeFormatterBenchmark.parse:?gc.alloc.rate       avgt   20  883.450 ? 8.163  MB/sec
> ZonedDateTimeFormatterBenchmark.parse:?gc.alloc.rate.norm  avgt   20  856.021 ? 0.079    B/op
> ZonedDateTimeFormatterBenchmark.parse:?gc.count            avgt   20   32.000          counts
> ZonedDateTimeFormatterBenchmark.parse:?gc.time             avgt   20   27.000              ms

Thanks, yes `2` seems best for performance if we take it as correct that this usually has only one value (I have nothing to back that up except the comment in the original change), and we're happy to rely on knowledge of the default load factor.

Do you have a preference for:

- Use 2 with no comment
- Use 2 with comment
- Use something like `1/0.75f + 1` which is semi self-documenting

Judging from https://bugs.openjdk.org/browse/JDK-8186958, load factor is rarely considered when setting initial capacity in existing code. Which to me makes sense, because it's a private detail of the HashMap implementation, hence the new methods which handle those internals safely.

(I still prefer not specifying, but I'm happy to add whatever you think is best)

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

PR Comment: https://git.openjdk.org/jdk17u-dev/pull/1414#issuecomment-1571875301


More information about the jdk-updates-dev mailing list