繁体   English   中英

使用 Java 11 而不是 1.8,xsl-fo 转换要慢得多

[英]xsl-fo transformation much slower with Java 11 instead of 1.8

After updating my program to Java 11, the transformations of an XML using xsl-fo (AWT renderer) have become much slower: Java 11: 90 seconds Java 1.8: 5 seconds

我没有用 Java 9 或 10 尝试过。

在使用 Java 11 和 1.8 运行之间没有代码和样式表更改。

我在 2.3 版中使用 org.apache.xmlgraphics:fop。

同样,对于 Saxon-HE 9.9.1-5(而不是 Xalan),不幸的是没有性能改进。

通过分析和调试,它看起来像 class org.apache.fop.layoutmgr.table.TableContentLayoutManager 中的代码行 284 消耗了时间:

nextRowGroupElems = rowGroupLM.getNextKnuthElements(context, alignment, bodyType);

所以罪魁祸首是使用 AWT 的 Apache FOP。 使用 MIME_PDF 而不是 MIME_FOP_AWT_PREVIEW 要快得多:5 秒对 90 秒。

分析器 (JProfiler) 显示 java.awt.EventDispatchThread 作为 Java 11 的热点。所以可能是 AWT 问题。

相关代码重现:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;

import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopConfParser;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.FopFactoryBuilder;
import org.apache.fop.apps.MimeConstants;
import org.springframework.core.io.ClassPathResource;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class MyTransform {

    public static void main(String[] args) throws Exception {
        Document xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream("my_xml.xml"));
        Document xslDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("my_xsl.xsl")); 

        Transformer transformer = TransformerFactory.newInstance().newTransformer(new DOMSource(xslDoc));

        DOMSource xmlDomSource = new DOMSource(xmlDoc);
        DOMResult domResult = new DOMResult();
        transformer.transform(xmlDomSource, domResult);

        Source src = new DOMSource(domResult.getNode());
        Result res = new SAXResult(createFopFactory().newFop(MimeConstants.MIME_FOP_AWT_PREVIEW, getDisplayAgent()).getDefaultHandler());

        TransformerFactory factory = javax.xml.transform.TransformerFactory.newInstance();
        transformer = factory.newTransformer();
        transformer.transform(src, res);

        transformer.transform(src, res); // took with Java 11 90 seconds and with Java 1.8 5 seconds
    }

    private static FopFactory createFopFactory() throws SAXException, IOException {
        ClassPathResource resource = new ClassPathResource("fop_configuration.xml");
        FopConfParser parser = new FopConfParser(resource.getInputStream(), resource.getURI()); //parsing configuration
        FopFactoryBuilder builder = parser.getFopFactoryBuilder(); //building the factory with the user options
        return builder.build();
    }

    private static FOUserAgent getDisplayAgent() throws SAXException, IOException {
        FopFactory fopFactory = createFopFactory();
        FOUserAgent displayAgent = fopFactory.newFOUserAgent();
        MyAWTRendererMaker maker = new MyAWTRendererMaker();
        displayAgent.getRendererFactory().addRendererMaker(maker);
        MyAWTRenderer displayRenderer = new MyAWTRenderer(displayAgent);
        displayAgent.setRendererOverride(displayRenderer);
        return displayAgent;
    }
}

我通过首先生成 PDF 然后将其显示在 ICEpdf 对话框而不是 Apache FOP 来解决问题。 似乎使用 output 格式 MIME_FOP_AWT_PREVIEW 会导致问题,而我现在使用 MIME_PDF。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM