RFR: 8333793: Improve BootstrapMethodInvoker for ConstantBootstraps and ProxyGenerator
Jorn Vernee
jvernee at openjdk.org
Fri Jun 7 13:46:18 UTC 2024
On Fri, 7 Jun 2024 12:12:44 GMT, Claes Redestad <redestad at openjdk.org> wrote:
> This PR refactors type matching in BootstrapMethodInvoker and adds a few types, seeking to improve bootstrap overheads of some ConstantBootstraps and in particular the ProxyGenerator condys generated for e.g. annotation proxies since [JDK-8332457](https://bugs.openjdk.org/browse/JDK-8332457)
>
> I've adjusted the micro-benchmark added by JDK-8332457 to not only generate a proxy but also call into one of the proxied methodt (`Object::hashCode`).
>
> Running org.openjdk.bench.java.lang.reflect.ProxyGenBench as a one-off startup benchmark sees significant improvement (-9% instructions, -6% cycles):
>
> Name Cnt Base Error Test Error Unit Change
> Perfstartup-JMH 20 154,000 ± 8,165 148,000 ± 23,164 ms/op 1,04x (p = 0,352 )
> :.cycles 925335973,200 ± 47147600,262 842221278,800 ± 46836254,964 cycles 0,91x (p = 0,000*)
> :.instructions 2101588857,600 ± 81105850,361 1966307798,400 ± 22011043,908 instructions 0,94x (p = 0,000*)
> :.taskclock 291,500 ± 16,494 262,000 ± 15,328 ms 0,90x (p = 0,000*)
> * = significant
>
> Number of classes loaded drops from 1096 to 1092
>
> Running the micro regularly shows no significant difference:
>
> Name Cnt Base Error Test Error Unit Change
> ProxyGenBench.generateAndProxy100 10 26,827 ± 8,954 26,855 ± 7,531 ms/op 1,00x (p = 0,991 )
> * = significant
src/java.base/share/classes/java/lang/invoke/BootstrapMethodInvoker.java line 145:
> 143: .invokeExact(caller, name, (MethodType)type, (MethodType)argv[0],
> 144: (MethodHandle)argv[1], (MethodType)argv[2]);
> 145: } else if (argv.length >= 1 && bsmType == SCF_MT) {
It seems that these `argv.length` comparisons were here for cases where the wrong number of arguments are passed to a bootstrap method?
I don't see why check `argv.length > 1` is still required here... Some of the other cases are also happy to just access `argv`, (which we also do here on the next line).
If you don't think this extract check is needed, please remove this source of confusion.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/19598#discussion_r1631232730
More information about the core-libs-dev
mailing list