RFR: 8268622: Performance issues in javac `Name` class
Archie Cobbs
acobbs at openjdk.org
Tue Aug 29 15:45:20 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`.
-------------
Commit messages:
- Change the default Name table implementation to StringNameTable.
Changes: https://git.openjdk.org/jdk/pull/15470/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=15470&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8268622
Stats: 18 lines in 2 files changed: 6 ins; 3 del; 9 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