Yep .. I vaguely remembered that we had such a report but would also have
had to hunt to locate it.

So we have the probable reason but not the solution.

FWIW I think it would be a fun project for a LCMS developer ...

-phil.

On 10/4/18, 10:47 PM, Daniel Persson wrote:
Hi Phil.

Well it seems like you've been in this discussion before

https://bugs.openjdk.java.net/browse/JDK-8041125

Wasn't aware that PDFBox PDF2Image used the Kcms Provider per default.
You may close this issue as we have figured out the reason.

Best regards
Daniel

On Fri, Oct 5, 2018 at 7:27 AM Philip Race <philip.r...@oracle.com <mailto:philip.r...@oracle.com>> wrote:



    On 10/4/18, 10:22 PM, Daniel Persson wrote:
    Hi Laurent

    Well that seems like a reasonable assumption.

    https://github.com/kalaspuffar/ColorConvTest/blob/master/KCMSTest.md

    The test with a "blank" image has a 1 seconds difference.

    And the test with an image from the PDF in question have a 52
    seconds difference.

    I tried playing with different image data but I didn't see a
    sensitivity to that.
    Maybe I needed to try something more complex.

    So why don't OpenJDK 9 and forward have KcmsServiceProvider bundled?
    Does this provider make a worse result on the image?

    It is not open source. It cannot be part of OpenJDK. Ever.
    And see my other email for the other reasons.
    So there is no quick or easy solution.

    FWIW the #1 reason I left KCMS in Oracle 8 and even 9 was because
    of the MT performance
    issue, but as we now converge Oracle JDK & OpenJDK that was a
    non-starter and it was
    removed along with other closed source components.

    -phil.

    Best regards
    Daniel




    On Fri, Oct 5, 2018 at 6:55 AM Laurent Bourgès
    <bourges.laur...@gmail.com <mailto:bourges.laur...@gmail.com>> 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


Reply via email to