<AWT Dev> [9] Review Request: 8071306 GUI perfomance are very slow compared java 1.6.0_45

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Thu May 7 00:39:13 UTC 2015


Hello.
Please review the fix for a jdk9. I plan to backport it to jdk8u60.

Description.
An UIworks really slowly, when an application has a lot of components in 
one container, and these components should be disabled one by one.
The reason is the next sequence of methods calls:
Component.setEnabled->updateCursorImmediately()-> some cursor related 
staff->GlobalCursorManager._updateCursor->Container.findComponentAt()-iteration 
over all components in the container.....-> twice....

You can imagine how it works in case of 10000 components in the container.

Note that in the bug report described difference jdk6 vs jdk8 -> 1sec vs 
6 sec. This was caused by the two fixes, one of which adds 
checkTreeLock() and in another one a simple array of components was 
replaced by the ArrayList. Since code was added to the really hot method 
we got so big slowdown.

To fix the problem I suggest two different approaches:
  - Container.java: Fix a general case, by eliminating a second 
iteration in the hot loop.
  - Component.java: Totally eliminates cursor machinery, if component 
cannot affect current cursor.

Some speedup measurements on my local system:
  - Simple removing of checkTreeLock() will partly solve a regression 
reported by the user(12 sec -> 5 sec).
  - Changes in the loop will speedup the code in the worse case(5->2 sec)
  - The changes in the Component.java will change the performance from 2 
sec to 100< ms

Test case which was added was improved from 10 seconds to 80 ms.

JMH test: 
http://cr.openjdk.java.net/~serb/8071306/SetEnabledPerformanceTest.java

Fixedversion:

Benchmark                                       Mode  Cnt Score       
Error   Units
SetEnabledPerformanceTest.testContains         thrpt    5 301300,813 ± 
17338,045  ops/ms
SetEnabledPerformanceTest.testFindComponentAt  thrpt    5 20,521 ±     
0,269  ops/ms
SetEnabledPerformanceTest.testGetComponentAt   thrpt    5 22,297 ±     
1,264  ops/ms
SetEnabledPerformanceTest.testSetEnabled       thrpt    5 711,120 ±    
19,837  ops/ms

Base version:

Benchmark                                       Mode  Cnt Score      
Error   Units
SetEnabledPerformanceTest.testContains         thrpt    5 299145,642 ± 
2120,183  ops/ms
SetEnabledPerformanceTest.testFindComponentAt  thrpt    5 1,101 ±    
0,012  ops/ms
SetEnabledPerformanceTest.testGetComponentAt   thrpt    5 6,792 ±    
0,097  ops/ms
SetEnabledPerformanceTest.testSetEnabled       thrpt    5 0,464 ±    
0,020  ops/ms


Bug: https://bugs.openjdk.java.net/browse/JDK-8071306
Webrev can be found at: http://cr.openjdk.java.net/~serb/8071306/webrev.03

--
Best regards, Sergey.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/awt-dev/attachments/20150507/c5e8e9f4/attachment-0001.html>


More information about the awt-dev mailing list