On Wed, 29 May 2024 15:20:56 GMT, Chen Liang <li...@openjdk.org> wrote:
> Also, have you considered micro-optimize Constructor.hashCode too? Given its > similar status to Method. Not at this time. This PR is motivated by observing Method.hashCode as a hotspot in a Spring heavy application when migrating to an ARM based platform. We did not observe Constructor.hashCode to be a hotspot in this application. > src/java.base/share/classes/java/lang/reflect/Method.java line 99: > >> 97: private Method root; >> 98: // Hash code of this object >> 99: private int hash; > > We can declare this field `@Stable`, like the `methodAccessor`. This was something that I tried and I observed a performance regression on the ARM platform that I was testing. From my understanding, `@Stable` tells the compiler to trust the contents of this field which is only given when the field holder is a known constant. This is generally true for cases like `Enums` but not usually for `Method`. Benchmark Mode Cnt Score Error Units # Intel Skylake MethodHashCode.benchmarkHashCode avgt 5 1.113 ± 1.146 ns/op # Arm Neoverse N1 MethodHashCode.benchmarkHashCode avgt 5 3.204 ± 0.001 ns/op > src/java.base/share/classes/java/lang/reflect/Method.java line 388: > >> 386: int hc = hash; >> 387: >> 388: if (hc == 0) { > > Should we add an extra field `hashIsZero` like in `String` to avoid repeated > computation if the hash is 0? Unlike with `String`, I don't often see cases where `Method` results in a hashCode of zero, which should be weighed with the overhead of adding in an additional variable. I believe some of the reasoning for handling zero-hashed Strings was about how easy it is to construct hash collisions and feed the JVM with bad Strings from an external actor. I don't believe this is an issue for `Method`. ------------- PR Comment: https://git.openjdk.org/jdk/pull/19433#issuecomment-2137699178 PR Review Comment: https://git.openjdk.org/jdk/pull/19433#discussion_r1619053915 PR Review Comment: https://git.openjdk.org/jdk/pull/19433#discussion_r1619079001