On Jul 16, 2014, at 11:40 AM, Remi Forax <fo...@univ-mlv.fr> wrote: > > On 07/16/2014 07:38 PM, Vladimir Ivanov wrote: >> Remi, >> >> The problem is that for every iteration you create new call site >> > for(int i=0; i<100_000; i++) { >> > new LoopyCS().getTarget().invokeExact(1_000); >> > } >> >> In LoopyCS constructor you instantiates 3 new MethodHandles: >> > target = MethodHandles.filterArguments(target, 0, FOO); >> > target = MethodHandles.guardWithTest(ZERO, >> > target, >> > MethodHandles.dropArguments(MethodHandles.constant(int.class, >> > 0).asType(MethodType.methodType(void.class)), 0, int.class)); >> >> Since we don't cache LambdaForms yet for these combinators, 3 new >> LambdaForms are created for each invocation. Then they are compiled to >> bytecode and then JIT kicks in. That's why you see continuous JITing. >> >> If you reuse a call site object, it stabilizes very quickly. > > doh, sorry for this stupid code :(
Everyone makes mistakes once in a while. Even you, Remi ;-) > >> >> Best regards, >> Vladimir Ivanov > > Rémi > >> >> On 7/12/14 6:05 PM, Remi Forax wrote: >>> It seems that the JIT is lost with whe there is a loopy callsite and >>> never stabilize (or the steady state is after the program ends). >>> >>> import java.lang.invoke.MethodHandle; >>> import java.lang.invoke.MethodHandles; >>> import java.lang.invoke.MethodType; >>> import java.lang.invoke.MutableCallSite; >>> >>> public class Loop { >>> static class LoopyCS extends MutableCallSite { >>> public LoopyCS() { >>> super(MethodType.methodType(void.class, int.class)); >>> >>> MethodHandle target = dynamicInvoker(); >>> target = MethodHandles.filterArguments(target, 0, FOO); >>> target = MethodHandles.guardWithTest(ZERO, >>> target, >>> MethodHandles.dropArguments(MethodHandles.constant(int.class, >>> 0).asType(MethodType.methodType(void.class)), 0, int.class)); >>> setTarget(target); >>> } >>> } >>> >>> static final MethodHandle FOO, ZERO; >>> static { >>> try { >>> FOO = MethodHandles.lookup().findStatic(Loop.class, "foo", >>> MethodType.methodType(int.class, int.class)); >>> ZERO = MethodHandles.lookup().findStatic(Loop.class, "zero", >>> MethodType.methodType(boolean.class, int.class)); >>> } catch (NoSuchMethodException | IllegalAccessException e) { >>> throw new AssertionError(e); >>> } >>> } >>> >>> private static boolean zero(int i) { >>> return i != 0; >>> } >>> >>> private static int foo(int i) { >>> COUNTER++; >>> return i - 1; >>> } >>> >>> private static int COUNTER = 0; >>> >>> public static void main(String[] args) throws Throwable { >>> for(int i=0; i<100_000; i++) { >>> new LoopyCS().getTarget().invokeExact(1_000); >>> } >>> System.out.println(COUNTER); >>> } >>> } >>> >>> cheers, >>> Rémi >>> >>> >>> _______________________________________________ >>> mlvm-dev mailing list >>> mlvm-dev@openjdk.java.net >>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev >> _______________________________________________ >> mlvm-dev mailing list >> mlvm-dev@openjdk.java.net >> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev > > _______________________________________________ > mlvm-dev mailing list > mlvm-dev@openjdk.java.net > http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
_______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev