They really do that ? So we can't fix that in OpenJDK.
Options include
1) contribute a big and complex MT enhancement to LittleCMS.
2) Tweak PDFBox to be more MT itself.
3) Buy a faster computer :-)
4) Maybe (?) see if there is a way to sub-divide the work we hand to LCMS
but that is on the scale of (1) and is not something likely to happen unless
it is a community contribution.
But I must add the caveat that I am not sure how well KCMS actually did
what it was asked anyway .. very old ... and unmaintained .. no support for
modern ICC profiles .. and insecure (too trusting) .. and not open source.
So many reasons to ditch it. And maybe the performance came at the
cost of correctness ...
And again, I still didn't see the same degradation myself.
-phil.
On 10/4/18, 9:53 PM, Laurent Bourgès wrote:
Phil,
I just gg a bit and got the PDFImage source:
public static void main( String[] args ) throws IOException
79 {
80 try
81 {
82 // force KCMS (faster than LCMS) if available
83 Class.forName("sun.java2d.cmm.kcms.KcmsServiceProvider");
84 System.setProperty("sun.java2d.cmm",
"sun.java2d.cmm.kcms.KcmsServiceProvider");
85 }
86 catch (ClassNotFoundException e)
87 {
88 LOG.debug("KCMS service not found - using LCMS", e);
89 }
90
https://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/PDFToImage.java?revision=1829374&view=markup
<https://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/PDFToImage.java?revision=1829374&view=markup>
That's all folks !
Le ven. 5 oct. 2018 à 01:00, Philip Race <philip.r...@oracle.com
<mailto:philip.r...@oracle.com>> a écrit :
Yep. LCMS is the default in 8u.
And although KCMS is a lot faster on my CConv test ...
~/jdk8u181/bin/java CConv
13289
~/jdk8u181/bin/java
-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider CConv
5131
It makes no difference on the pdf conversion :
~/jdk8u181/bin/java -jar pdfbox-app-2.0.11.jar PDFToImage -time
test.pdf Rendered 1 page in 4985ms
~/jdk8u181/bin/java
-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider -jar
pdfbox-app-2.0.11.jar PDFToImage -time test.pdf
Rendered 1 page in 4723ms
Note: KCMS maybe faster on CConv but it has no support for modern
ICC profiles
and I haven't checked if it is even applying the pdfbox one properly.
But it does have support to split a job into concurrent tasks for
sub-images
which can help on the larger images like the one I am using in CConv.
-phil.
On 10/4/18, 2:24 PM, Philip Race wrote:
I might be losing it, but I am 99% sure that LCMS is the color
conversion engine in 8.
KCMS was there only for backup. You'd have to know the magic flag
to get it and
no one has said anything to the effect that they are using it.
-phil.
On 10/4/18, 11:33 AM, Laurent Bourgès wrote:
Phil,
I wondered if ang RenderingHint defaults changed since 8...
Moreover I started playing with linux perf + jit agent and it is
easy than before wigh oprofile + jvmtiagent.
I noticed that OracleJDK8 uses KCMS and OpenJDK11 uses LCMS for
color conversion as does OpenJDK8, that could explain the
performance gap.
Finally PDFImage test is run only once so the overhead may come
from warmup (jit, g1)...
More later,
Laurent
Le jeu. 4 oct. 2018 à 20:03, Phil Race <philip.r...@oracle.com
<mailto:philip.r...@oracle.com>> a écrit :
On 10/03/2018 11:58 PM, Laurent Bourgès wrote:
Hi,
I will get the code and add debugging logs: env & system
properties and java2d RenderingHints.
The code in pdfbox passes null for the hints. So there
should be no difference attributable to that.
-phil.
I suspect these hints are different or have a noticiable
impact: color interpolation & rendering quality.
I suppose the backend corresponds to software loops but
some 2d operations can be accelerated ?
Anyway I will push any change in the code.
PS: I can run linux perf to profile both java & native code....
Cheers,
Laurent
Le jeu. 4 oct. 2018 à 07:50, Daniel Persson
<mailto.wo...@gmail.com <mailto:mailto.wo...@gmail.com>> a
écrit :
Hi Philip and Laurent.
I've talked with Tilman and Andreas from the PDFBox
team and they see similar connections to the
ColorConvertOp filter but wanted to try with one of the
images of the PDF as a raster.
As we try different things I thought it good for
collaboration to create a repository with the code so
all can contribute.
https://github.com/kalaspuffar/ColorConvTest
I've run the 3 different tests on my Machine (Thinkpad
P51s) with custom Gentoo installed, if important to the
conversation.
I tried to invite you all as collaborators to this
repository if you think this is a bad Idea let me know.
Best regards
Daniel
On Wed, Oct 3, 2018 at 7:51 PM Laurent Bourgès
<bourges.laur...@gmail.com
<mailto:bourges.laur...@gmail.com>> wrote:
Very good job, phil.
I will try your CCONV test on my linux machine to
see if it is platform dependent ... or hw ?
Laurent
Le mer. 3 oct. 2018 à 19:19, Philip Race
<philip.r...@oracle.com
<mailto:philip.r...@oracle.com>> a écrit :
On 10/3/18, 1:15 AM, Laurent Bourgès wrote:
Phil,
If you look at the given pdf file, it has
large images that exceed 2k so such ones may
be more costly to convert.
FWIW the one I profiled was by far the largest
at 2577x1540.
The rest are more like 100x100, 200x200 or
500x500 - all approximations.
As jpeg decoder in openjdk11 is different than
oraclejdk8, it may cause more ColorConvertOp
filter operations ... if color profiles are
different.
That doesn't seem likely and in fact since I
instrumented ColorConvertOp in 8 & 11, I know
exactly how many times it was invoked
by pdfbox, (11 times in both cases) and that
all the image data is the same. SRC and DEST
are the same types etc.
Also the version of LCMS is the same in 8 and
11 (v2.9).
-phil
Anyway this performance is not related to
Marlin renderer, so I can not help much except
in its diagnostic.
Cheers,
Laurent
Le mar. 2 oct. 2018 à 23:35, Philip Race
<philip.r...@oracle.com
<mailto:philip.r...@oracle.com>> a écrit :
I've spent some time examining what pdfbox
is passing to ColorConvertOp
It is called about 10 or 11 times in this
test with images typically 1-2K in each
dimension.
The input image is a Custom BufferedImage
which uses an ICC_ColorSpace constructed
from a color profile file that is embedded
in pdfbox which is an open source equivalent
of what Acrobat uses. It has a 4 component
raster and is opaque
This is filtered into a 3 component
standard INT_RGB ColorModel.
I've distilled this down into a small
program which has an copy of the method
that is defined in pdfbox and is invoking
the supposedly slow ColorConvertOp.
So I believe this is all exactly what is
happening in pdfbox.
What I find is that it is actually much
faster on JDK11 than JDK 8.
prrubuntu:~$ ~/jdk-11/bin/java CConv
4881
prrubuntu:~$ ~/jdk8u181/bin/java CConv
12529
I can't say why that would be but the
results are clear.
So I am left to suppose that pdfbox really
is doing something different in 8 vs 11.
Or that this not the real problem. What do
others see ?
I've attached the program. The 1Mb color
profile file can be got from the pdfbox
sources.
-phil.
On 10/2/18, 9:35 AM, Laurent Bourgès wrote:
Hi Daniel,
Let's not compare apples and oranges.
What I can see it takes the same
route and behave similarly.
I agree, I did not take enough time to
get accurate profiles, sorry.
If you look at
http://uhash.com/java_reg/Call_Tree_java_8.html
http://uhash.com/java_reg/Call_Tree_java_11.html
You can see that ConvertOp.filter
takes 1.5s longer on Java 11.
I confirm: 1.8s vs 300ms.
Philip, do you know what could have
change in this 2d area ?
I imagine ColorConvertOp delegates to
native code so color profile (ICC) or
hidpi support may have an impact here (or
just compiler options may be different) ...
If needed, I could profile native code
using oprofile / perf.
Laurent