On Wed, 26 Apr 2023 15:04:50 GMT, Adam Sotona <asot...@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