RFR: 8268622: Performance issues in javac `Name` class [v2]

Archie Cobbs acobbs at openjdk.org
Tue Sep 26 21:41:54 UTC 2023


> Quoting [JDK-8268622](https://bugs.openjdk.org/browse/JDK-8268622):
>> The javadoc team has identified performance issues in the javac `Name` class, particularly when it is used via its `CharSequence` interface ([JDK-8263321](https://bugs.openjdk.org/browse/JDK-8263321)). The main issue there is that the `CharSequence` is specifically character-oriented, whereas the native form inside javac is a byte[] in modified-UTF8 form. Operations like `.length()` and `.charAt(int)` have "simple" but very inefficient implementations.
> 
> Thanks to [JDK-8269957](https://bugs.openjdk.org/browse/JDK-8269957) we now have the option to swap in a `String`-based `Name` table implementation in place of the current UTF-8-based one. This does in fact improve performance of the compiler.
> 
> This patch does two things:
> * Make the `String`-based `Name` table implementation the default. The two other UTF-8-based implementations are still available via the flags `-XDuseUnsharedTable=true` and `-XDuseSharedTable=true` (the latter was the previous default). This results in a 19% speedup in my simple benchmark (see below).
> * Adds a new flag `-XDinternStringTable=true`, which turns on `intern()`ing of the `String`s in the `String` table. This however is **not** the default because it results in lower performance (see below). But it's possible this could help in other scenarios so it's left in there for future testing purposes.
> 
> Here are results from the [JavacNameTable.java](https://github.com/openjdk/jdk/files/12466359/JavacNameTable.java.txt) benchmark.
> 
> Benchmark                             Mode  Cnt   Score   Error  Units
> JavacNameTable.testSharedTable        avgt   25  54.145 ± 1.738  ms/op
> JavacNameTable.testStringTable        avgt   25  45.305 ± 0.415  ms/op
> JavacNameTable.testStringTableIntern  avgt   25  50.736 ± 0.245  ms/op
> JavacNameTable.testUnsharedTable      avgt   25  59.877 ± 2.503  ms/op
> 
> To reiterate: `testSharedTable` reflects the previous default; `testStringTable` reflects the new default. The other two options are available via the flags `-XDinternStringTable=true` and `-XDuseUnsharedTable=true`.

Archie Cobbs has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains two additional commits since the last revision:

 - Merge branch 'master' into JDK-8268622
 - Change the default Name table implementation to StringNameTable.
   
   This removes the "useStringTable" flag (since it's now the default),
   adds a "useSharedTable" flag (since it's no longer the default), and
   adds an "internStringTable" flag enabling intern()'ing Name strings.

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/15470/files
  - new: https://git.openjdk.org/jdk/pull/15470/files/5f623886..1dcafc70

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=15470&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=15470&range=00-01

  Stats: 17779 lines in 415 files changed: 12781 ins; 2668 del; 2330 mod
  Patch: https://git.openjdk.org/jdk/pull/15470.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/15470/head:pull/15470

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


More information about the compiler-dev mailing list