Review request for 6977034 Thread.getState() very slow

Mandy Chung mandy.chung at oracle.com
Mon Dec 6 23:35:31 UTC 2010


  On 12/6/10 2:41 PM, Eamonn McManus wrote:
> Reviewed OK!
> The constant JVMTI_THREAD_STATE_WAITING is not used but that's my only 
> minor niggle.

Will take it out.

Thanks for the review.
Mandy

> Éamonn [emcmanus]
>
> On 06/12/2010 20:26, Mandy Chung wrote:
>> Remi, Eamonn, Brian, David, Doug,
>>
>> Thanks for the feedback.
>>
>> On 12/04/10 04:22, Eamonn McManus wrote:
>>> Hi Mandy,
>>>
>>> This test:
>>>
>>>          if ((threadStatus&  JVMTI_THREAD_STATE_RUNNABLE) == 1) {
>>>
>>> is always false, since JVMTI_THREAD_STATE_RUNNABLE is 4. (NetBeans 
>>> 7.0 helpfully flags this; I'm not sure if earlier versions do.)
>>>
>>
>> Good catch.   This explains why the speed up for RUNNABLE was not as 
>> high in the microbenchmark measurement.  Correcting it shows that 
>> Thread.getState() gets 3.5X speed up on a thread in RUNNABLE state.
>>
>>> But, once corrected, I think you could use this idea further to 
>>> write a much simpler and faster method, on these lines:
>>>
>>>      public static Thread.State toThreadState(int threadStatus) {
>>>          if ((threadStatus&  JVMTI_THREAD_STATE_RUNNABLE)*!= 0*) {
>>>              return RUNNABLE;
>>>          } else if ((threadStatus&  JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) != 0) {
>>>              return BLOCKED;
>>>          } else if ((threadStatus&  JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT) != 0) {
>>>              return TIMED_WAITING;
>>>          } else if ((threadStatus&  JVMTI_THREAD_STATE_WAITING_INDEFINITELY) != 0) {
>>>              return WAITING;
>>>          } else if ((threadStatus&  JVMTI_THREAD_STATE_TERMINATED) != 0) {
>>>              return TERMINATED;
>>>          } else {
>>>              return NEW;
>>>          }
>>>      }
>>
>> I forgot to mention in the email that I implemented this simpler 
>> approach to compare with the table lookup approach.   There were no 
>> significant difference.  I now rerun with the corrected fix (checking 
>> != 0 rather than == 1) and the table lookup approach is about 2-6% 
>> faster than the sequence of tests approach.
>>
>> I am also for the simpler approach but I post the table lookup 
>> approach as a proposed fix to get any opinion on the performance 
>> aspect with that approach.
>>
>> Given that the Fork-Join framework doesn't depend on it, I will go 
>> for a simpler approach (sequence of tests) and further tune its 
>> performance when there is a use case requiring a perf improvement.
>>
>> New webrev:
>> http://cr.openjdk.java.net/~mchung/6977034/webrev.01/
>>
>> Can you review this version?
>>
>> Thanks
>> Mandy
>>
>>> You could tweak the order of the tests based on what might be the 
>>> relative frequency of the different states but it probably isn't 
>>> worth it.
>>>
>>> Regards,
>>> Éamonn
>>>
>>> On 3/12/10 11:52 PM, Mandy Chung wrote:
>>>> Fix for 6977034: Thread.getState() very slow
>>>>
>>>> Webrev at:
>>>> http://cr.openjdk.java.net/~mchung/6977034/webrev.00/
>>>>
>>>> This is an improvement to map a Thread's threadStatus field to 
>>>> Thread.State.  The VM updates the Thread.threadStatus field 
>>>> directly at state transition with the value as defined in JVM TI 
>>>> [1].  The java.lang.Thread.getState() implementation can directly 
>>>> access the threadStatus value and do a direct lookup from an array 
>>>> of Thread.State.  The threadStatus value is a bit vector and we 
>>>> would have to create an array of a minimum of 1061 (0x425) elements 
>>>> to do direct mapping.   I took the approach to use the first 
>>>> highest order bit set to 1 in the masked threadStatus value as the 
>>>> index to the Thread.State element and only caches 32 elements 
>>>> (could be fewer).  I wrote a micro-benchmark measuring the 
>>>> Thread.getState of a thread in different state that shows 1.7X to 
>>>> 6X speedup (see below).  There is possibly some issue with my 
>>>> micro-benchmark that I didn't observe the 14X speed up as Doug did 
>>>> in his experiment.  However, I'd like to get this reviewed and 
>>>> pushed to the repository so that anyone can do more experiment on 
>>>> the performance measurement.
>>>>
>>>> Thanks
>>>> Mandy
>>>> P.S. The discussion on this thread can be found at [2] [3].
>>>>
>>>> [1] 
>>>> http://download.java.net/jdk7/docs/platform/jvmti/jvmti.html#GetThreadState
>>>> [2] 
>>>> http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-July/004567.html
>>>> [3] 
>>>> http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-August/004721.html
>>>>
>>>>
>>>> 	JDK 7 b120 (in ms)	With fix (in ms)	Speed up
>>>> main		46465	        22772			2.04
>>>> NEW		50676		29921			1.69
>>>> RUNNABLE	42202		14690			2.87
>>>> BLOCKED		72773		12296			5.92
>>>> WAITING		48811		13041			3.74
>>>> TIMED_WAITING	45737		12849			3.56
>>>> TERMINATED	40314		16376			2.46
>>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/core-libs-dev/attachments/20101206/bcab7d35/attachment.html>


More information about the core-libs-dev mailing list