RFR: 8343559: Optimize Class.getMethod(String, Class<?>...) for methods with no-arg [v2]

jengebr duke at openjdk.org
Wed Nov 6 17:31:33 UTC 2024


On Wed, 6 Nov 2024 15:19:31 GMT, Chen Liang <liach at openjdk.org> wrote:

>> jengebr has updated the pull request incrementally with three additional commits since the last revision:
>> 
>>  - Optimizing filter logic by internalizing loop
>>  - Enhancing benchmark + tests with additional 5-arg cases
>>  - Removing no-arg optimization
>
> src/java.base/share/classes/java/lang/PublicMethods.java line 108:
> 
>> 106:                                Class<?>[] ptypes) {
>> 107:             // check for matching param types length, then name, then param type equality
>> 108:             return method.getParameterCount() == ptypes.length &&
> 
> Length check is already present in `equals`.  If you want this fast path, I think moving arrays equals check first is better.

I benchmarked variations on this and got some surprises.  The noArg change was removed prior to any experiments, so this is strictly the `matches()` optimization.

Base case (no PR):

Benchmark                          Mode  Cnt     Score    Error  Units
ClassGetMethod.getConcreteFiveArg  avgt    6    94.586 ±  0.733  ns/op
ClassGetMethod.getConcreteNoArg    avgt    6    75.587 ± 11.300  ns/op
ClassGetMethod.getIntfFiveArg      avgt    6   215.794 ±  7.713  ns/op
ClassGetMethod.getIntfNoArg        avgt    6   200.418 ±  4.352  ns/op
ClassGetMethod.getNoSuchMethod     avgt   10  2207.928 ± 49.767  ns/op
ClassGetMethod.getSuperFiveArg     avgt    6   190.142 ±  1.995  ns/op
ClassGetMethod.getSuperNoArg       avgt    6   153.943 ±  7.491  ns/op


With `Arrays.equals()`, then name:

Benchmark                          Mode  Cnt     Score    Error  Units
ClassGetMethod.getConcreteFiveArg  avgt    6    82.949 ±  7.614  ns/op
ClassGetMethod.getConcreteNoArg    avgt    6    98.248 ± 11.482  ns/op
ClassGetMethod.getIntfFiveArg      avgt    6   204.604 ±  5.656  ns/op
ClassGetMethod.getIntfNoArg        avgt    6   225.582 ±  5.238  ns/op
ClassGetMethod.getNoSuchMethod     avgt   10  2216.038 ± 48.732  ns/op
ClassGetMethod.getSuperFiveArg     avgt    6   172.416 ±  3.211  ns/op
ClassGetMethod.getSuperNoArg       avgt    6   138.102 ± 16.215  ns/op

(faster in some cases, slower in others)

With paramCount, then name, then Arrays.equals():

Benchmark                          Mode  Cnt     Score    Error  Units
ClassGetMethod.getConcreteFiveArg  avgt    6    95.117 ±  1.574  ns/op
ClassGetMethod.getConcreteNoArg    avgt    6    77.915 ± 10.294  ns/op
ClassGetMethod.getIntfFiveArg      avgt    6   193.514 ±  4.611  ns/op
ClassGetMethod.getIntfNoArg        avgt    6   205.957 ±  4.475  ns/op
ClassGetMethod.getNoSuchMethod     avgt   10  2234.166 ± 51.249  ns/op
ClassGetMethod.getSuperFiveArg     avgt    6   164.650 ±  3.689  ns/op
ClassGetMethod.getSuperNoArg       avgt    6   128.969 ±  4.442  ns/op

(faster or neutral in all cases)

With paramCount, then name, then custom loop:

Benchmark                          Mode  Cnt     Score    Error  Units
ClassGetMethod.getConcreteFiveArg  avgt    6    64.802 ±  4.504  ns/op
ClassGetMethod.getConcreteNoArg    avgt    6    51.998 ±  5.645  ns/op
ClassGetMethod.getIntfFiveArg      avgt    6   194.252 ±  7.759  ns/op
ClassGetMethod.getIntfNoArg        avgt    6   199.110 ±  4.163  ns/op
ClassGetMethod.getNoSuchMethod     avgt   10  2216.636 ± 33.669  ns/op
ClassGetMethod.getSuperFiveArg     avgt    6   157.460 ± 19.412  ns/op
ClassGetMethod.getSuperNoArg       avgt    6   125.441 ±  2.990  ns/op

(fastest or neutral results in all cases)

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

PR Review Comment: https://git.openjdk.org/jdk/pull/21929#discussion_r1831449004


More information about the core-libs-dev mailing list