RFR: 8306842: Classfile API performance improvements

Chen Liang liach at openjdk.org
Tue May 9 15:18:36 UTC 2023


On Wed, 26 Apr 2023 15:04:50 GMT, Adam Sotona <asotona at openjdk.org> wrote:

> Following improvements implemented:
> - Switch over `String` replaced with switch single char
> - Binary search for frames in `StackMapGenerator`
> - `StackMapGenerator.rawHandlers` with pre-calculated offsets
> - `ClassEntry` is caching `ClassDesc` symbol
> - Caching of type symbols in `NameAndTypeEntry` and `MethodTypeEntry`
> - Caching `MethodTypeDesc` in `MethodInfo` implementations
> - `StackMapGenerator` and `Utils` delegating to cached `MethodTypeDesc` instead of custom parsing
> 
> No API change.
> 
> Benchmarks show stack map generation improved by 21% and code generation from symbols improved by 30%.
> 
> 
> Benchmark                     Mode  Cnt       Score       Error  Units
> GenerateStackMaps.benchmark  thrpt   10  407931.202 ± 13101.023  ops/s
> RebuildMethodBodies.shared   thrpt    4   10258.597 ±   383.699  ops/s
> RebuildMethodBodies.unshared thrpt    4    7224.543 ±   256.800  ops/s
> 
> 
> 
> Benchmark                     Mode  Cnt       Score      Error  Units
> GenerateStackMaps.benchmark  thrpt   10  495101.110 ± 2389.628  ops/s
> RebuildMethodBodies.shared    thrpt   4   13380.272 ±  810.113  ops/s
> RebuildMethodBodies.unshared  thrpt   4    9399.863 ±  557.060  ops/s

These casts can call the Util method instead, and their import of `AbstractPoolEntry` can be removed.

src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java line 746:

> 744: 
> 745:     private void processFieldInstructions(RawBytecodeHelper bcs) {
> 746:         var desc = ((AbstractPoolEntry.NameAndTypeEntryImpl)((MemberRefEntry)cp.entryByIndex(bcs.getIndexU2())).nameAndType()).fieldTypeSymbol();

Suggestion:

        var desc = Util.fieldTypeSymbol((MemberRefEntry)cp.entryByIndex(bcs.getIndexU2())).nameAndType());

src/java.base/share/classes/jdk/internal/classfile/instruction/FieldInstruction.java line 80:

> 78:      */
> 79:     default ClassDesc typeSymbol() {
> 80:         return ((AbstractPoolEntry.NameAndTypeEntryImpl)field().nameAndType()).fieldTypeSymbol();

Suggestion:

        return Util.fieldTypeSymbol(field().nameAndType());

src/java.base/share/classes/jdk/internal/classfile/instruction/InvokeDynamicInstruction.java line 73:

> 71:      */
> 72:     default MethodTypeDesc typeSymbol() {
> 73:         return ((AbstractPoolEntry.NameAndTypeEntryImpl)invokedynamic().nameAndType()).methodTypeSymbol();

Suggestion:

        return Util.methodTypeSymbol(invokedynamic().nameAndType());

src/java.base/share/classes/jdk/internal/classfile/instruction/InvokeInstruction.java line 93:

> 91:      */
> 92:     default MethodTypeDesc typeSymbol() {
> 93:         return ((AbstractPoolEntry.NameAndTypeEntryImpl)method().nameAndType()).methodTypeSymbol();

Suggestion:

        return Util.methodTypeSymbol(method().nameAndType());

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

PR Review: https://git.openjdk.org/jdk/pull/13671#pullrequestreview-1418886418
PR Review Comment: https://git.openjdk.org/jdk/pull/13671#discussion_r1188762210
PR Review Comment: https://git.openjdk.org/jdk/pull/13671#discussion_r1188762982
PR Review Comment: https://git.openjdk.org/jdk/pull/13671#discussion_r1188764353
PR Review Comment: https://git.openjdk.org/jdk/pull/13671#discussion_r1188764783


More information about the core-libs-dev mailing list