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

Reply via email to