优化DOM和XPathJava代码
我的代码太慢了,但我不知道如何改进它。从磁盘到DOM中读取1k文件大约需要20毫秒,这可能取决于磁盘,但我还有20毫秒用于处理xpath语句,这太多了。下面是一些带有时间注释的示例代码。如何改进代码 这发生在施工时:优化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();
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