Am 08.05.2013 23:12, schrieb John Rose: > On May 8, 2013, at 5:33 AM, Jochen Theodorou <blackd...@gmx.org> wrote: > >> Am 07.05.2013 19:31, schrieb Christian Thalinger: >> [...] >>> Do you have any numbers?The problem is that if the MH is not constant >>> we can't do any inlining and it will be an out-of-line call (with a >>> trampoline in between). Is >>> your DMH a static or virtual? >> >> arg... looks like I made a mistake. It is not the invokeExact that is >> slow, it is my preparation of the handle that is slow. > > So it's an insertArgs and asType that's slow. Can you distill the operations > into a micro-benchmark for us?
to reduce it to only asType: compare the times of this: > MethodHandle mh = MethodHandles.lookup().findVirtual(String.class, > "toString", MethodType.methodType(String.class)); > int tmax = 1_000_000; > for (int k=0; k<20; k++) { > long t1 = System.nanoTime(); > for (int i=0; i<tmax; i++) { > String s = (String) mh.invokeExact(str); > } > long t2 = System.nanoTime(); > System.out.println((t2-t1)/tmax); > } with this: > MethodHandle mh = MethodHandles.lookup().findVirtual(String.class, > "toString", MethodType.methodType(String.class)); > MethodType invokeType = MethodType.methodType(Object.class, > String.class); > int tmax = 1_000_000; > for (int k=0; k<20; k++) { > long t1 = System.nanoTime(); > for (int i=0; i<tmax; i++) { > MethodHandle invoker = mh.asType(invokeType); > Object o = invoker.invokeExact(str); > } > long t2 = System.nanoTime(); > System.out.println((t2-t1)/tmax); > } The first one has times of about 9-15 on my machine, the later one 800-900. I am aware that this is a test in which hotspot should throw out the invocation completely, but it does not. Even more interesing is when you reduce the test even further: > MethodHandle mh = MethodHandles.lookup().findVirtual(String.class, > "toString", MethodType.methodType(String.class)); > MethodType invokeType = MethodType.methodType(Object.class, > String.class); > int tmax = 1_000_000; > for (int k=0; k<20; k++) { > long t1 = System.nanoTime(); > for (int i=0; i<tmax; i++) { > MethodHandle invoker = mh.asType(invokeType); > } > long t2 = System.nanoTime(); > System.out.println((t2-t1)/tmax); > } Now this should really be optimized away completely by hotspot, but is not and takes about the same time as the second case... which is not surprising since the asType call is totally dominating the "benchmark". btw, the test was with a jdk 1.8.0 ea with tiered compilation turned off. The tests contain no warmup, but that's what why the test is repeated 20 times to see the development of the values instead of doing a one time measurement. And the values in this test go up and down a lot too bye blackdrag -- Jochen "blackdrag" Theodorou - Groovy Project Tech Lead blog: http://blackdragsview.blogspot.com/ german groovy discussion newsgroup: de.comp.lang.misc For Groovy programming sources visit http://groovy-lang.org _______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev