MethodHandle lookup&invocation performance
John Rose
john.r.rose at oracle.com
Sat Jul 9 23:24:06 PDT 2011
On Jul 9, 2011, at 7:13 AM, Alexander Turner wrote:
> I am Alex Turner - I was working on a COBOL to JVM compiler and am now
> helping with a Magik to JVM compiler. I thought I might just confirm
> that invokeExact has proven a lt ot quicker than invoke in our tests.
> We have also noticed that using a method adapter to convert argument
> counts makes things a little slower (a few percent). But using an
> adapter then invokeExact is much faster than using invoke.
Yes. I expect disparity will reduce over time, but the initial implementation of inexact invoke (in Hotspot, maybe not J9) is very basic.
Method handle creation is currently slow, because it calls native methods to set up the magic nodes. This needs to be refactored to be native-free (or at least intrinsified) so that inline MH creation can be optimized using normal means.
For now, expect MH creation to go much slower than MH invocation. And, since inexact invoke can create temporary MHs to make up type mismatches, this means inexact invoke can also be slow.
One thing that we've tried to make fast out of the box is invokedynamic's call to a MH. This performs inlining of the MH graph.
Another use case which benefits from this particular optimization trick is "static final" method handles. I.e., if you want to get invokedynamic-like performance in plain Java code, consider doing your work by invoking MH constants. This means your bootstrap logic has to run in the static initializer of the class containing the constants, which is less flexible (more eager). But it's an option.
> My approach from here is to try very hard to avoid invoke and only use
> it when there is no realistic chance of resolving an invokeExact for
> more than one call.
Onward!
-- John
More information about the mlvm-dev
mailing list