RFR: 8041125: ColorConvertOp filter much slower in JDK 8 compared to JDK7

Sergey Bylokhov serb at openjdk.java.net
Wed Oct 6 22:36:17 UTC 2021


We have improved the cmm code over a few releases and mostly resolve the JDK-8041125. But I have executed an attached test case under a profiler and found that:

* less than 10% is an actual pixel transformation inside littlecms
* 30% is a native up-calls like getXXField
* 30% is incoming arrays coping
* 30% results array saving
* others

This change removes the native up-calls and passes all data from the java side.

Notes:

* The above numbers are true for the "pure Java" implementation in the test case, where we transform the image pixel by pixel, if the image is big and we transform it at once via filter then we spend most of the time in the littlecms code
* JDK7 uses 4 threads in the filter implementation, but single-threaded jdk17 is faster because of some code improvement in cmm profiles initialization during the "cold start". And probably because the image is not so big(625x843).
* If the size of the image will be increased and the warmup is done the jdk7 will be 4x time faster, this is another opportunity that I'll try to resolve later.


Tested on macOS (fastest result after a few runs):
||JDK 7 | JDK 8 | JDK 17 | FIX |
|----|----|----|----|----|
|With filter |  307 ms  |  456 ms  |  242 ms  |   236 ms |
|In pure Java|  1672 ms  |  389 ms  |  300 ms  |  259 ms  |


JMH before/after the fix
`ColorSpace.toRGB/fromRGB/toCIEXYZ/fromCIEXYZ(new float[]{1,1,1})`
single threaded and multi-threaded(MAX = 30):
![image](https://user-images.githubusercontent.com/14138494/136283699-05e47dca-e7f8-43a1-97d3-53072d3589f6.png)

https://jmh.morethan.io/?gists=b1edd5e5ebeb1b76867b2112be30145d,fc86ce4a6f8f2f49e9ab512ef641c11b

-------------

Commit messages:
 - Update LCMS.java
 - initial fix

Changes: https://git.openjdk.java.net/jdk/pull/5835/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=5835&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8041125
  Stats: 137 lines in 4 files changed: 9 ins; 101 del; 27 mod
  Patch: https://git.openjdk.java.net/jdk/pull/5835.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/5835/head:pull/5835

PR: https://git.openjdk.java.net/jdk/pull/5835



More information about the client-libs-dev mailing list