优化DOM和XPathJava代码

优化DOM和XPathJava代码,java,xml,dom,xpath,jaxp,Java,Xml,Dom,Xpath,Jaxp,我的代码太慢了,但我不知道如何改进它。从磁盘到DOM中读取1k文件大约需要20毫秒,这可能取决于磁盘,但我还有20毫秒用于处理xpath语句,这太多了。下面是一些带有时间注释的示例代码。如何改进代码 这发生在施工时: DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = this.dbFactory.newDocumentBuilder();

我的代码太慢了,但我不知道如何改进它。从磁盘到DOM中读取1k文件大约需要20毫秒,这可能取决于磁盘,但我还有20毫秒用于处理xpath语句,这太多了。下面是一些带有时间注释的示例代码。如何改进代码

这发生在施工时:

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = this.dbFactory.newDocumentBuilder(); 
XPathExpression[] ex = new XPathExpression[]{about 30 different expressions}
XPathExpression mainEx =xPath.compile("/rootElement/firstLevel/secondLevel");
然后代码:

Document doc = this.dBuilder.parse("somefile.xml");
//took 20 ms until here
NodeList nodes = (NodeList) mainEx .evaluate,doc, XPathConstants.NODESET);
 //took another 20 ms until here !!!
    for (int i = 0; i < nodes.getLength(); i++) {
    Node n = nodes.item(i);
    for (XPathExpression e:ex) {
         String v = (String) e.evaluate(n, XPathConstants.STRING);
        if (v != null) {
            System.out.println(v);
        }
    }
    }
    //this only takes 5 ms
Document doc=this.dBuilder.parse(“somefile.xml”);
//到这里花了20毫秒
NodeList节点=(NodeList)mainEx.evaluate、doc、XPathConstants.NODESET);
//在这里又花了20毫秒!!!
对于(int i=0;i
您应该使用将XPath表达式预编译为。然后打电话

如果您不止一次地执行它,这将节省您的时间。我假设是这样的,或者20毫秒不重要


编辑:如评论中所述,这里有更多的信息,包括JVM参数。

您可能遇到了我在这里记录的问题:

本质上,您应该添加以下JVM参数以大大加快Xalan的XPath实现:

-Dorg.apache.xml.dtm.DTMManager=
  org.apache.xml.dtm.ref.DTMManagerDefault


我将所有内容都更改为预编译表达式,但这并不能真正提高性能,可能需要几毫秒。是否有更快的方法构建dom或更快的xPath计算器?@Franz,因此仅计算先前编译的表达式就需要近20毫秒的时间?您正在使用哪个实现(我想
getClass
会告诉您)?这表明Xalan 2.7.1是(测试中)最快的,并为optimization.com.sun.org.apache.xpath.internal.jaxp.XPathImpl提供了一个JVM参数,我应该切换吗?@Franz,我相信这是捆绑的Xalan。不过,我不确定是哪个版本。试一下我链接的问题中的JVM参数。不是很完美,但大约需要8毫秒。但是仍然要使用10ms来评估这样一个基本的xPath。可能与切换到VTD-XML有关<您的问题将消失
-Dcom.sun.org.apache.xml.internal.dtm.DTMManager=
  com.sun.org.apache.xml.internal.dtm.ref.DTMManagerDefault