Hello, Thanks for your swift responses.
On Sat, Jul 9, 2011 at 19:29, Rémi Forax <fo...@univ-mlv.fr> wrote: >> You should avoid to create constants more than once. Indeed. I updated the benckmark. (please see below) >> Also, bindTo() will create a method handle for-each call. Sure, but 'bindTo(rec).invokeExact(arg)' looks faster than 'invoke(rec, arg)' for this microbenchmark. >> or like that: >> >> private static final MethodHandles.Lookup lookup = >> MethodHandles.lookup(); >> private static final MethodType mt = >> MethodType.methodType(String.class, String.class); >> private static final MethodType mt2 = >> MethodType.methodType(String.class, Object.class, String.class); >> >> private static MethodHandle methodhandleLookup(Object receiver, String >> methodName) throws Throwable { >> MethodHandle mh = lookup.findVirtual(receiver.getClass(), >> methodName, mt); >> return mh.asType(mt2); >> } >> >> private static String methodhandleInvoke(Object receiver, MethodHandle >> method) throws Throwable { >> return (String) method.bindTo(receiver).invokeExact(receiver, >> "methodhandle"); >> } > > oups, typo: > > private static String methodhandleInvoke(Object receiver, MethodHandle > method) throws Throwable { > return (String) method.invokeExact(receiver, "methodhandle"); > } Thank you very much. I didn't understand asType well. Here's the updated code: https://raw.github.com/nahi/jsr292-sandbox/master/src/jp/gr/java_conf/jruby/MethodHandleTest.java and the benchmark result follows. I updated 'methodhandle' as 'methodhandle1' to use constants, and added 'methodhandle2' which uses 'asType'. Interestingly, 'methodhandle2' invocation perf got as fast as reflection, but lookup got slower than 'methodhandle1'. -- 0 methodhandle1 lookup * 100000: 557.97 [msec], average: 5.58 [nsec] methodhandle1 lookup+invoke * 100000: 431.21 [msec], average: 4.31 [nsec] methodhandle2 lookup * 100000: 413.81 [msec], average: 4.14 [nsec] methodhandle2 lookup+invoke * 100000: 297.56 [msec], average: 2.98 [nsec] reflection lookup * 100000: 99.52 [msec], average: 1.00 [nsec] reflection lookup+invoke * 100000: 181.40 [msec], average: 1.81 [nsec] -- 1 methodhandle1 lookup * 100000: 192.42 [msec], average: 1.92 [nsec] methodhandle1 lookup+invoke * 100000: 289.65 [msec], average: 2.90 [nsec] methodhandle2 lookup * 100000: 267.24 [msec], average: 2.67 [nsec] methodhandle2 lookup+invoke * 100000: 327.26 [msec], average: 3.27 [nsec] reflection lookup * 100000: 38.44 [msec], average: 0.38 [nsec] reflection lookup+invoke * 100000: 65.53 [msec], average: 0.66 [nsec] -- 2 methodhandle1 lookup * 100000: 176.79 [msec], average: 1.77 [nsec] methodhandle1 lookup+invoke * 100000: 270.87 [msec], average: 2.71 [nsec] methodhandle2 lookup * 100000: 259.02 [msec], average: 2.59 [nsec] methodhandle2 lookup+invoke * 100000: 289.60 [msec], average: 2.90 [nsec] reflection lookup * 100000: 31.77 [msec], average: 0.32 [nsec] reflection lookup+invoke * 100000: 104.24 [msec], average: 1.04 [nsec] -- 3 methodhandle1 lookup * 100000: 220.45 [msec], average: 2.20 [nsec] methodhandle1 lookup+invoke * 100000: 282.01 [msec], average: 2.82 [nsec] methodhandle2 lookup * 100000: 265.23 [msec], average: 2.65 [nsec] methodhandle2 lookup+invoke * 100000: 299.53 [msec], average: 3.00 [nsec] reflection lookup * 100000: 39.24 [msec], average: 0.39 [nsec] reflection lookup+invoke * 100000: 70.76 [msec], average: 0.71 [nsec] -- 4 methodhandle1 lookup * 100000: 183.54 [msec], average: 1.84 [nsec] methodhandle1 lookup+invoke * 100000: 268.61 [msec], average: 2.69 [nsec] methodhandle2 lookup * 100000: 262.18 [msec], average: 2.62 [nsec] methodhandle2 lookup+invoke * 100000: 284.43 [msec], average: 2.84 [nsec] reflection lookup * 100000: 28.34 [msec], average: 0.28 [nsec] reflection lookup+invoke * 100000: 62.86 [msec], average: 0.63 [nsec] -- 5 methodhandle1 lookup * 100000: 182.89 [msec], average: 1.83 [nsec] methodhandle1 lookup+invoke * 100000: 260.14 [msec], average: 2.60 [nsec] methodhandle2 lookup * 100000: 262.31 [msec], average: 2.62 [nsec] methodhandle2 lookup+invoke * 100000: 284.80 [msec], average: 2.85 [nsec] reflection lookup * 100000: 28.60 [msec], average: 0.29 [nsec] reflection lookup+invoke * 100000: 67.08 [msec], average: 0.67 [nsec] -- 6 methodhandle1 lookup * 100000: 191.14 [msec], average: 1.91 [nsec] methodhandle1 lookup+invoke * 100000: 260.52 [msec], average: 2.61 [nsec] methodhandle2 lookup * 100000: 246.75 [msec], average: 2.47 [nsec] methodhandle2 lookup+invoke * 100000: 282.33 [msec], average: 2.82 [nsec] reflection lookup * 100000: 28.98 [msec], average: 0.29 [nsec] reflection lookup+invoke * 100000: 66.73 [msec], average: 0.67 [nsec] -- 7 methodhandle1 lookup * 100000: 182.27 [msec], average: 1.82 [nsec] methodhandle1 lookup+invoke * 100000: 260.33 [msec], average: 2.60 [nsec] methodhandle2 lookup * 100000: 255.34 [msec], average: 2.55 [nsec] methodhandle2 lookup+invoke * 100000: 290.13 [msec], average: 2.90 [nsec] reflection lookup * 100000: 30.20 [msec], average: 0.30 [nsec] reflection lookup+invoke * 100000: 72.33 [msec], average: 0.72 [nsec] -- 8 methodhandle1 lookup * 100000: 176.21 [msec], average: 1.76 [nsec] methodhandle1 lookup+invoke * 100000: 267.92 [msec], average: 2.68 [nsec] methodhandle2 lookup * 100000: 261.67 [msec], average: 2.62 [nsec] methodhandle2 lookup+invoke * 100000: 285.91 [msec], average: 2.86 [nsec] reflection lookup * 100000: 34.12 [msec], average: 0.34 [nsec] reflection lookup+invoke * 100000: 68.78 [msec], average: 0.69 [nsec] -- 9 methodhandle1 lookup * 100000: 181.78 [msec], average: 1.82 [nsec] methodhandle1 lookup+invoke * 100000: 265.34 [msec], average: 2.65 [nsec] methodhandle2 lookup * 100000: 252.99 [msec], average: 2.53 [nsec] methodhandle2 lookup+invoke * 100000: 299.42 [msec], average: 2.99 [nsec] reflection lookup * 100000: 31.08 [msec], average: 0.31 [nsec] reflection lookup+invoke * 100000: 66.65 [msec], average: 0.67 [nsec] Am I still missing something? Regards, // NaHi _______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev