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