MethodHandle.invoke* performance

Remi Forax forax at univ-mlv.fr
Wed Apr 3 10:36:46 PDT 2013


On 04/03/2013 07:00 PM, Julien Ponge wrote:
>
> Remi,
>
>
> Did you publish Dalvik changes somewhere? (or plan to?)

The official (visible) repository is here
   https://bitbucket.org/jpilliet/android-292
but it only contains the patches to compile android with 1.7,
the rest of the patches will be available ...
when available.

>
> Cheers

cheers,
Rémi

>
>
> On Wed, Apr 3, 2013 at 6:32 PM, Remi Forax <forax at univ-mlv.fr 
> <mailto:forax at univ-mlv.fr>> wrote:
>
>     On 04/03/2013 06:12 PM, Cédric Champeau wrote:
>     > Le 03/04/2013 17:50, Remi Forax a écrit :
>     >> Sorry to be rude, but it's still a micro-benchmark ...
>     > First of all, yes, it is :) And as the classical fibonacci
>     benchmark,
>     > it's useless but relevant for understanding how things work :)
>     >> for invokedynamic, it's not in theory, if your method handle is
>     constant
>     >> either because it's a static final or because it is nested in a
>     >> CallSite, it's constant for the JIT, thus fully optimized.
>     >>
>     >> for method handle on stack, the method handle is obviously not
>     constant
>     >> moreover the JIT is not able use trick to make it constant (like
>     >> hoisting it out of the loop,
>     >> or doing the inlining algorithm in a backward way etc.)
>     >> More on that later ...
>     > Well, even if I make my MH variable declaration "final", the
>     performance
>     > is the same, so I assume there's no local analysis, right?
>
>     'final' on a local variable is a modifier for the compiler, not
>     for the JIT.
>     There are several local analysis, but not the ones you think.
>
>     >> As you said it's a micro-benchmark so you end up with unusual good
>     >> performance,
>     >> by example the call to j.l.r.Method is optimized as never it
>     will be in
>     >> a real program
>     >> (you call the method in the same unit it was declared and
>     >> you have less than 3 instances of Method that are called more
>     than 60
>     >> times).
>     >>
>     >> Now, Krystal is currently working to add a cache when a method
>     handle is
>     >> called,
>     >> so in few betas, the performance of method handles of your
>     >> micro-benchmark will improve dramatically.
>     > That's good to know :)
>     >> And the cache of MethodHandle is better that the cache which is
>     used for
>     >> j.l.r.Method because it can be local to a callsite and not
>     global (in
>     >> fact local to one callsite in the code of j.l.r.Method that is
>     used by
>     >> the invocation path when you call "invoke").
>     >>
>     >> Anyway, because it's a micro-benchmark the result will be as
>     useless as
>     >> now to predict the behaviour of a real world program.
>     > I can perfectly understand why some path is optimized or not,
>     what I
>     > find surprising is more the order of magnitude here. So yes,
>     calling
>     > invoke() takes more than 50s where reflection takes only 1.2s,
>     and even
>     > invokeExact is slower (~3 to 1). My point is more than if
>     MethodHandles
>     > are branded as "faster" than reflection (I heard you say it ;)),
>     then
>     > there is something wrong.
>
>     I say that in the context of proxies, i.e. where you can emit an
>     invokedynamic to store the method handle at callsite, method
>     handle are
>     faster than using reflection because you don't need proxies anymore
>     (remember I said that too :).
>
>     > You should expect people doing stupid things like me, thinking
>     it will be faster than plain reflection. At least, the docs should
>     mention something about performance.
>
>     The javadoc is the spec, we are talking about the Oracle
>     implementation
>     of the spec.
>     On Android, Jerome and I have run some tests that shows that a
>     MethodHandle.invokeExact is always faster than a call to the
>     Reflection,
>     it's just because the reflection is super slow on Android not the
>     opposite.
>
>     >> cheers,
>     >> Rémi
>     > Thanks for your answer :)
>
>     Rémi
>
>     _______________________________________________
>     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