什么时候JDOM XPATH比使用getChildren的元素搜索更快?

时间:2012-05-14 18:09:07

标签: java jdom jdom-2

使用: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块中):

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次迭代中最为一致。

第一个示例在.29 ms + - 0.01ms附近完成。

第二个示例在.013ms到.002ms之间的任何地方完成。

考虑到足够长的测试,两者的运行时间都非常短。

对我来说,XPath更容易编写,但getChild路由似乎更灵活但有点冗长。尽管如此,我还是不介意为速度做准备。即使100次迭代也非常快,所以这可能是学术性的......

最终,我想知道:

是否存在JDOM Xpath比显示的替代样式更快的情况?

JDom XPath(在任何Java / JDOM版本中)带来哪些好处?

1 个答案:

答案 0 :(得分:3)

这里有一些注意事项....我已经完成了(我是JDOM维护者)关于JDOM 2.0.1的大量工作,特别是在XPath评估的性能方面。以下是一些数字:

http://hunterhacker.github.com/jdom/jdom2/performance.html

从下往上阅读。

以下是一些其他有趣的数字(比较不同的Java VM版本的不同JDOM版本)

http://hunterhacker.github.com/jdom/jdom2/performanceJDK.html

'底线'......

  • JDOM 2.x引入了更快的迭代器。 Jaxen 非常 Iterator密集型,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