MethodHandle lookup&invocation performance

Hervé Girod herve.girod at gmail.com
Mon Jul 11 07:11:18 PDT 2011


That's great then! I will try to inokedynamicize my code soon to see what I could gain ;)

Herve

Sent from my iPhone

On 11 juil. 2011, at 15:36, Rémi Forax <forax at univ-mlv.fr> wrote:

> On 07/11/2011 03:34 PM, Hervé Girod wrote:
>> Hello,
>> 
>> My comprehension is that the lookup can be performed only once, to get the MethodHandle, and that checks are done there and not after when using the MethodHandle anymore. Am I right?
> 
> Yes !
> 
> Rémi
> 
>> Sent from my iPhone
>> 
>> On 11 juil. 2011, at 15:17, Christian Thalinger<christian.thalinger at oracle.com>  wrote:
>> 
>>> On Jul 9, 2011, at 3:27 PM, Hiroshi Nakamura wrote:
>>>> Hello,
>>>> 
>>>> Thanks for you comments.
>>>> 
>>>> On Sat, Jul 9, 2011 at 19:01, Jochen Theodorou<blackdrag at gmx.org>  wrote:
>>>>>> Code is here:
>>>>>> https://raw.github.com/nahi/jsr292-sandbox/master/src/jp/gr/java_conf/jruby/MethodHandleTest.java
>>>>> lookup I don't know. I am not sure about the recent versions, I think
>>>>> the lookup is using the same "core" as Reflection plus additional
>>>>> checks. I don't expect that to be faster. It would be very nice though.
>>>>> 
>>>>> The performance of the invocation cannot be meassured like you do it I
>>>>> think. The big pro comes from the ability to inline the method calls,
>>>>> but this is only present if you use the invokedynamic bytecode
>>>>> instruction. There is currently no way in Java to express invokedynamic.
>>>> Sure. I should have written it clearly. I heard from someone at Java
>>>> SE 7 launch event that reflection would get faster on Java SE 7 even
>>>> if you don't use dynamic language, so I wanted to measure the
>>>> MethodHandle perf without invokedynamic.
>>>> 
>>>> For invokedynamic, I did some (bogus, experimental, micro)benchmark
>>>> with current JRuby.
>>>> http://bit.ly/invokedynamic (Flash, Japanese)
>>>> Please see the circle at the right edge of 5 circles. Invokedynamic
>>>> support of JRuby is still experimental but it already outperforms
>>>> existing optimization code for some microbenchmarks. Great job,
>>>> Charles.
>>> Just a quick follow up on the tak numbers, which look really bad.  The problem here is that we inline the fallback path (a bug we know about).  Excluding that one method from inlining actually gives better numbers with invokedynamic:
>>> 
>>> intelsdv03.us.oracle.com:/export/twisti/jruby$ jruby -X+C --server bench/bench_tak.rb 5
>>>      user     system      total        real
>>>  1.300000   0.000000   1.300000 (  1.263000)
>>>  1.018000   0.000000   1.018000 (  1.018000)
>>>  1.018000   0.000000   1.018000 (  1.018000)
>>>  1.027000   0.000000   1.027000 (  1.027000)
>>>  1.024000   0.000000   1.024000 (  1.023000)
>>> 
>>> intelsdv03.us.oracle.com:/export/twisti/jruby$ jruby -X+C --server -J-XX:CompileCommand=dontinline,*.invocationFallback bench/bench_tak.rb 5
>>> CompilerOracle: dontinline *.invocationFallback
>>>      user     system      total        real
>>>  0.619000   0.000000   0.619000 (  0.580000)
>>>  0.422000   0.000000   0.422000 (  0.422000)
>>>  0.422000   0.000000   0.422000 (  0.422000)
>>>  0.422000   0.000000   0.422000 (  0.422000)
>>>  0.422000   0.000000   0.422000 (  0.422000)
>>> 
>>> intelsdv03.us.oracle.com:/export/twisti/jruby$ jruby -X+C --server -Xcompile.invokedynamic=false bench/bench_tak.rb 5
>>>      user     system      total        real
>>>  0.824000   0.000000   0.824000 (  0.788000)
>>>  0.565000   0.000000   0.565000 (  0.565000)
>>>  0.565000   0.000000   0.565000 (  0.565000)
>>>  0.565000   0.000000   0.565000 (  0.565000)
>>>  0.565000   0.000000   0.565000 (  0.565000)
>>> 
>>> -- Christian
>>> 
>>>> Disclaimer: I'm one of a JRuby committer :)
>>>> 
>>>>> And a third point... even if there where invokedynamic used, I think in
>>>>> your case it would not really bring forth the real performance
>>>>> possibilities, since your receiver is changing all the time.
>>>> Sure. JRuby's current invokedynamic code checks receiver type with the
>>>> test for guardWithTest if I understand correctly. Invokedynamic would
>>>> not bring perf gain for my sample MethodHandleTest, but if naive
>>>> MethodHandle invocation is slower than reflection, invokedynamic might
>>>> be the way I thought.
>>>> 
>>>>> But in general I must say, I would have expected the performance to be
>>>>> at least near Reflection as well. I mean the situation is for Reflection
>>>>> not all that better.
>>>> Agreed. I won't expect it to Java SE 7 GA though.
>>>> 
>>>> Regards,
>>>> // NaHi
>>>> _______________________________________________
>>>> mlvm-dev mailing list
>>>> mlvm-dev at openjdk.java.net
>>>> 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
>> _______________________________________________
>> mlvm-dev mailing list
>> mlvm-dev at openjdk.java.net
>> 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


More information about the mlvm-dev mailing list