Removing intrinsic of Thread.isInterrupted()

Christian Thalinger christian.thalinger at oracle.com
Tue Feb 25 10:26:28 PST 2014


On Feb 25, 2014, at 10:05 AM, Aleksey Shipilev <aleksey.shipilev at oracle.com> wrote:

> Hi Yumin,
> 
> On 02/25/2014 09:25 PM, Yumin Qi wrote:
>>  Thanks for the info, I modified as
> 
> Ok, if you still wish to go for hand-rolled benchmarks:
> 
>>        final int  NUM = 20000;
>>        boolean interrupts[] = new boolean[NUM];
>>        start = System.currentTimeMillis();
>>        for (int j = 0; j < 100; j++) {
>>            for (int i = 0; i < NUM; i++) {
>>                interrupts[i] = t.isInterrupted();
>>            }
>>        }
>>        finish = System.currentTimeMillis();
>>        osum = finish - start;
>>        System.out.println(NUM + " calls cost: " + osum  + " ms");
> 
> So, this benchmark still suffers from:
> * The absence of warmup
> * Dead-code elimination of interrupts[] accesses, and the elimination
> of t.isInterrupted as the result.
> * System.currentTimeMillis() (high) granularity
> * Loop unrolling for both "i" and "j" loops, further affected by the
> presence of inlined code for isInterrupted, or native call stub
> * Possible hoisting of t.isInterrupted() from the loop (native methods
> should be immune, and I remember there should be the barrier in the
> intrinsic to prevent that)
> 
>> The result showed no difference (even a little better without intrinsic).
> 
> ...and that begs the question, right? Why does it happen? Why the
> performance is similar for seemingly different code paths? Is intrinsic
> not working whatsoever? Is the experiment correct? Do we actually
> measure it right, etc?

No we don’t.  I was having a hard time to believe that a JNI call is as faster (or even faster) then the intrinsic so I looked into the test case and the intrinsic.  Here is the condition when the intrinsic goes fast-path:

  // Add a fast path to t.isInterrupted(clear_int):
  //   (t == Thread.current() && (!TLS._osthread._interrupted || !clear_int))
  //   ? TLS._osthread._interrupted : /*slow path:*/ t.isInterrupted(clear_int)

The first condition is not true in the test case so we always go slow-path.

> 
>> I think I can remove it from hotspot.
> 
> I don't think we can, until we understand the performance implications
> through and through.
> 
> Thanks,
> -Aleksey.



More information about the hotspot-compiler-dev mailing list