Review request for 6977034 Thread.getState() very slow
David Holmes
David.Holmes at oracle.com
Mon Dec 6 23:56:06 UTC 2010
Thumbs up from me.
Thanks,
David
Mandy Chung said the following on 12/07/10 05:26:
> 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
>>>
>
More information about the core-libs-dev
mailing list