【问题标题】:When is JDOM XPATH faster than element hunting with getChildren?JDOM XPATH 何时比使用 getChildren 进行元素搜索更快?
【发布时间】:2012-05-22 06:07:09
【问题描述】:

使用: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 次迭代后最为一致。

第一个示例大约在 0.29 毫秒 +- 0.01 毫秒内完成。

第二个示例在 0.013 毫秒到 0.002 毫秒之间完成。

只要测试足够长,两者的运行时间都非常短。

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

最后我想知道:

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

JDom XPath(在任何版本的 Java/JDOM 中)带来什么好处?

【问题讨论】:

  • 您已经回答了自己的问题。
  • 我希望得到有关该主题的权威的 cmets :) 我对 JDOM 比较陌生。
  • jaxen 这些年的表现好像倒退了

标签: java jdom jdom-2


【解决方案1】:

这里有几件事情需要注意......我在 JDOM 2.0.1 上做了很多工作(我是一名 JDOM 维护者),尤其是在 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 XPath 没有任何好处....
  • 即使在最好的情况下,“本机”搜索方法也会比 XPath 版本更快。

您最大的性能提升将来自运行 Java7,然后升级到 JDOM 2.x

虽然“自定义”搜索如果编写得好,总是比 XPath 快。

编辑:此外,JDOM 2.x 引入了一个用于运行 XPath 查询的新 API,您可能会发现它更易于使用(尽管旧 API 仍然有效):https://github.com/hunterhacker/jdom/wiki/JDOM2-Feature-XPath-Upgrade

【讨论】:

  • 优秀的分数。我的这个项目越来越多地要求从过时的软件中删除,我肯定会在这里使用这些资源来证明我的观点。谢谢!
  • rolfl- 在使用简单/普通查询时,我注意到 jdom1 XPath 存在性能问题。 (例如:/root/child1/sub2/blah,文档中只有一个节点是 /root/child1/sub2,并且该节点有很多“blah”子节点)查看 jdom 代码,我发现在 DefaultLocationPath.evaluate(...) 它在返回之前对查询结果进行排序。这种类型占据了大部分的执行时间。你能告诉我我可以做些什么来避免那里发生的排序吗?
  • 嗨特雷弗。合适的人是 Jaxen 人,而不是 JDOM。另一方面,排序很大程度上依赖于在“兄弟”(blah's)上创建迭代器。 JDOM 2.x 有一个更快的迭代器概念,因此它比 JDOM 1.x 更快。如果你想更多地讨论这个细节,你可能应该注册 jdom-interest 邮件列表或 jaxen malining 列表。这些是正确的论坛......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
相关资源
最近更新 更多