Why is "checkcast MethodHandle" necessary in methodHandleInvokeLinkerMethod?

Paul Sandoz paul.sandoz at oracle.com
Mon Apr 9 21:10:42 UTC 2018


Place the MH in a static final, then the JIT can constant fold.

You might find the following helpful:

  https://wiki.openjdk.java.net/display/HotSpot/Method+handles+and+invokedynamic <https://wiki.openjdk.java.net/display/HotSpot/Method+handles+and+invokedynamic>
  https://wiki.openjdk.java.net/display/HotSpot/Deconstructing+MethodHandles <https://wiki.openjdk.java.net/display/HotSpot/Deconstructing+MethodHandles>

Paul.

> On Apr 9, 2018, at 2:06 PM, Ioi Lam <ioi.lam at oracle.com> wrote:
> 
> Hi John,
> 
> That was my suspicion and thanks for confirming it.
> 
> I wrote a simple benchmark to try to compare the speed of a 'real' method invocation vs MH.invokeExact
> 
> http://cr.openjdk.java.net/~iklam/misc/method_handle_bench/BenchMH.java <http://cr.openjdk.java.net/~iklam/misc/method_handle_bench/BenchMH.java>
> 
> Basically
> 
>     private static void loopMH(int loops, MethodHandle mh) throws Throwable {
>         for (int i=0; i<loops; i++) {
>             mh.invokeExact("yo!");
>         }
>     }
>  
>    -vs-
>  
>  
>     private static void loopDirect(int loops) {
>         for (int i=0; i<loops; i++) {
>             callme("yo!");
>         }
>     }
> 
> $ java -cp . BenchMH 1000000000
> ...
> MH:      loops = 1000000000: elapsed = 10332 ms
> direct:  loops = 1000000000: elapsed = 7500 ms
> 
> So it seems like the JIT still can't handle such a simple case ... :-(
> 
> 
> On 4/9/18 1:32 PM, John Rose wrote:
>> On Apr 9, 2018, at 1:17 PM, Ioi Lam <ioi.lam at oracle.com <mailto:ioi.lam at oracle.com>> wrote:
>>> 
>>> So why is this first argument not declared as a MethodHandle?
>>> 
>> 
>> The short answer is to simplify the plumbing of lambda forms.
>> 
>> Method handles are strongly typed but the underlying IR of
>> lambda forms is weakly typed.  This keeps the IR simple.
>> To make up the difference, casts are inserted where necessary.
>> Most (not all) uses of MHs are inlined and/or customized,
>> in which case the JIT simply drops the casts.
>> 
>> — John
>> 
>>  
>> _______________________________________________ mlvm-dev mailing list mlvm-dev at openjdk.java.net <mailto:mlvm-dev at openjdk.java.net> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev <http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev> 
> 
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20180409/dbedfb2d/attachment.html>


More information about the mlvm-dev mailing list