2011-11-27 71 views
3

我的代码太慢了,但我不确定如何改进它。从磁盘读取到1k文件的DOM需要大约20 ms,这可能是好的,具体取决于磁盘,但是接下来我还有20 ms用于处理xpath语句,这太多了。以下是一些带有时间注释的示例代码。我如何改进代码?优化DOM和XPath Java代码

这发生在施工时间:

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 
+0

可能与http://stackoverflow.com/questio相关ns/6340802/java -xpath-apache-jaxp-implementation-performance –

+0

切换到VTD-XML <您的问题将消失 –

回答

3

你可能会从这个问题,我记录在这里的痛苦:

Java XPath (Apache JAXP implementation) performance

从本质上讲,你要添加这些JVM参数在很大程度上加快Xalan的XPath实现:

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

-Dcom.sun.org.apache.xml.internal.dtm.DTMManager= 
    com.sun.org.apache.xml.internal.dtm.ref.DTMManagerDefault 
4

你应该预先编译XPath表达式到XPathExpression,使用XPath.compile。然后致电XPathExpression.evaluate

如果您多次执行它,这将节省您的时间。我假设情况是这样,或20毫秒应该不重要。

编辑:正如在评论中提到的,这question有进一步的信息,包括一个JVM参数。

+0

我将所有内容都更改为预编译表达式,但它并未真正提升性能,可能只有几ms。有没有更快的方法来构建dom或更快的xPath评估器? –

+0

@Franz,所以它只需要将近20毫秒来评估一个以前编译的表达式?你正在使用哪个实现(我认为'getClass'会告诉你)?这[问题](http://stackoverflow.com/questions/6340802/java-xpath-apache-jaxp-implementation-performance)表明Xalan 2.7.1是最快的(测试过的),并且提供了用于优化的JVM参数。 –

+0

该示例将更新您的想法。 –