使用:Java 1.5/JDom 1.1.3/Jaxen 1.1.1
我编写的测试是为了证实在 JDOM 中使用预编译 XPATH 比遍历子元素更快的信念。相反,我发现 XPATH 比遍历子列表、执行字符串比较和寻找我想要的东西慢 4 到 5 倍。
对于上下文,我的 XPath 是这样的:
/root/quote/vehicle[@id = 'some vehicle']/coverage[@id = 'some coverage']/code";
并且实际评估正在计时(在 try/catch block 中):
String element = path.valueOf(doc).getText();
替代搜索是:
List<Element> vehicleList = doc.getRootElement()
.getChild("quote")
.getChildren("vehicle");
for(Element vehElement : vehicleList)
if(vehElement.getAttributeValue("id").equals("some vehicle")){
List<Element> coverageList = ele.getChildren("coverage");
for(Element covElement : coverageList){
if(covElement.getAttributeValue("id").equals("some coverage")){
element = covElement.getChild("CoverageType").getText();
break;
}
}
}
奇怪的是,虽然使用 XPATH 的方法的运行时间要慢得多,但它在 1000 次迭代后最稳定。
第一个示例完成大约 0.29 毫秒 +- 0.01 毫秒。
第二个示例的完成时间介于 .013 毫秒和 .002 毫秒之间。
如果测试时间足够长,这两种方法的运行时间都非常短。
XPath 对我来说更容易编写,但是 getChild 路由似乎更灵活但有点冗长。这仍然是我不介意为速度做的交易。这也是事实,即使是 100 次迭代也非常快,所以这可能是学术上的......
最后我想知道:
是否存在 JDOM Xpath 比显示的替代样式更快的情况?
JDom XPath(在任何版本的 Java/JDOM 中)带来什么好处?
最佳答案
这里有几件事要注意……我已经(我是 JDOM 维护者)对 JDOM 2.0.1 进行了大量工作,尤其是在 XPath 评估的性能方面。以下是一些数字:
http://hunterhacker.github.com/jdom/jdom2/performance.html
自下而上阅读。
这里有一些其他有趣的数字(比较不同的 JDOM 版本和不同的 Java VM)
http://hunterhacker.github.com/jdom/jdom2/performanceJDK.html
“底线”....
- JDOM 2.x 引入了更快的迭代器。 Jaxen 非常迭代器密集,JDOM 2.x 中的性能改进在这方面意义重大....
- Java 7 在迭代器性能方面也比以前的版本快很多。
- “编译”Jaxen XPaths 没有任何好处....
- 即使在最好的情况下,“本地”搜索方法也会比 XPath 版本更快。
最大的性能提升将来自运行 Java7,然后升级到 JDOM 2.x
尽管“自定义”搜索,如果编写得当,将始终比 XPath 更快。
编辑:另外,JDOM 2.x 引入了一个用于运行 XPath 查询的新 API,您可能会发现它更易于使用(尽管旧 API 仍然有效):https://github.com/hunterhacker/jdom/wiki/JDOM2-Feature-XPath-Upgrade
关于java - JDOM XPATH 什么时候比使用 getChildren 搜索元素更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10588710/