RFR: 8332249: Micro-optimize Method.hashCode [v2]
Aleksey Shipilev
shade at openjdk.org
Tue Jun 11 09:01:26 UTC 2024
On Mon, 3 Jun 2024 18:00:35 GMT, Sean Gwizdak <duke at openjdk.org> wrote:
>> Improve the speed of Method.hashCode by caching the hashcode on first use. I've seen an application where Method.hashCode is a hot path, and this is a fairly simple speedup. The memory overhead is low.
>>
>> This addresses issue [JDK-8332249](https://bugs.openjdk.org/browse/JDK-8332249).
>>
>> Before:
>>
>> Benchmark Mode Cnt Score Error Units
>> # Intel Skylake
>> MethodHashCode.benchmarkHashCode avgt 5 1.843 ± 0.149 ns/op
>> # Arm Neoverse N1
>> MethodHashCode.benchmarkHashCode avgt 5 2.363 ± 0.091 ns/op
>>
>>
>>
>> After:
>>
>>
>> Benchmark Mode Cnt Score Error Units
>> # Intel Skylake
>> MethodHashCode.benchmarkHashCode avgt 5 1.121 ± 1.189 ns/op
>> # Arm Neoverse N1
>> MethodHashCode.benchmarkHashCode avgt 5 1.001 ± 0.001 ns/op
>
> Sean Gwizdak 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 six additional commits since the last revision:
>
> - Remove trailing whitespace.
> - Move hashCode benchmark into the newly created MethodBenchmark file
> - Merge branch 'master' into method-hashcode-JDK-8332249
> - Remove changes to JavaDoc per guidance.
> - Fix whitespace issues pointed by the bot
> - Micro-optimize Method.hashCode
As usual in these cases, we need to make a footprint argument as well. `Method` is a special class with lots of injected fields, so the only "true" source of layout information is `-XX:+PrintFieldLayout`. It tells me there is a 4-byte tail due to object alignment in compressed oops mode. This can accommodate a new `int` field. There seems to be no space when compressed oops are disabled.
# Out of the box, compressed oops enabled
Layout of class java/lang/reflect/Method
Instance fields:
@0 12/- RESERVED
@12 "override" Z 1/1 INHERITED
@13 "callerSensitive" B 1/1 REGULAR
@14 2/1 EMPTY
@16 "accessCheckCache" Ljava/lang/Object; 4/4 INHERITED
@20 "parameterData" Ljava/lang/reflect/Executable$ParameterData; 4/4 INHERITED
@24 "declaredAnnotations" Ljava/util/Map; 4/4 INHERITED
@28 "slot" I 4/4 REGULAR
@32 "modifiers" I 4/4 REGULAR
@36 "clazz" Ljava/lang/Class; 4/4 REGULAR
@40 "name" Ljava/lang/String; 4/4 REGULAR
@44 "returnType" Ljava/lang/Class; 4/4 REGULAR
@48 "parameterTypes" [Ljava/lang/Class; 4/4 REGULAR
@52 "exceptionTypes" [Ljava/lang/Class; 4/4 REGULAR
@56 "signature" Ljava/lang/String; 4/4 REGULAR
@60 "genericInfo" Lsun/reflect/generics/repository/MethodRepository; 4/4 REGULAR
@64 "annotations" [B 4/4 REGULAR
@68 "parameterAnnotations" [B 4/4 REGULAR
@72 "annotationDefault" [B 4/4 REGULAR
@76 "methodAccessor" Ljdk/internal/reflect/MethodAccessor; 4/4 REGULAR
@80 "root" Ljava/lang/reflect/Method; 4/4 REGULAR
Instance size = 88 bytes
# -XX:-UseCompressedOops
Layout of class java/lang/reflect/Method
Instance fields:
@0 12/- RESERVED
@12 "override" Z 1/1 INHERITED
@13 "callerSensitive" B 1/1 REGULAR
@14 2/1 EMPTY
@16 "accessCheckCache" Ljava/lang/Object; 8/8 INHERITED
@24 "parameterData" Ljava/lang/reflect/Executable$ParameterData; 8/8 INHERITED
@32 "declaredAnnotations" Ljava/util/Map; 8/8 INHERITED
@40 "slot" I 4/4 REGULAR
@44 "modifiers" I 4/4 REGULAR
@48 "clazz" Ljava/lang/Class; 8/8 REGULAR
@56 "name" Ljava/lang/String; 8/8 REGULAR
@64 "returnType" Ljava/lang/Class; 8/8 REGULAR
@72 "parameterTypes" [Ljava/lang/Class; 8/8 REGULAR
@80 "exceptionTypes" [Ljava/lang/Class; 8/8 REGULAR
@88 "signature" Ljava/lang/String; 8/8 REGULAR
@96 "genericInfo" Lsun/reflect/generics/repository/MethodRepository; 8/8 REGULAR
@104 "annotations" [B 8/8 REGULAR
@112 "parameterAnnotations" [B 8/8 REGULAR
@120 "annotationDefault" [B 8/8 REGULAR
@128 "methodAccessor" Ljdk/internal/reflect/MethodAccessor; 8/8 REGULAR
@136 "root" Ljava/lang/reflect/Method; 8/8 REGULAR
Instance size = 144 bytes
-------------
PR Comment: https://git.openjdk.org/jdk/pull/19433#issuecomment-2160170846
More information about the core-libs-dev
mailing list