2012-05-14 103 views
1

使用:Java的1.5/1.1.3 JDOM/Jaxen的1.1.1JDOM XPATH何时比使用getChildren寻找元素更快?

我写的测试是确认的信念,在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中)带来了什么好处?

+0

你已经回答了你自己的问题。 – skaffman

+0

我一直希望得到关于这个问题的权威评论:)我对JDOM比较陌生。 – JHarnach

+0

jaxen的表现似乎已经倒退多年 –

回答

3

在这里有几点需要注意....我已经完成了(我是一个JDOM维护者)在JDOM 2.0.1上的大量工作,特别是关于XPath评估的性能。这里有一些数字:

​​

从下往上阅读。

下面是其他一些有趣的数字(比较不同版本的JDOM与不同的Java虚拟机的)

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中引入了一个新的API来运行,你可能会发现更容易使用(虽然旧的API仍然可以工作),XPath查询:https://github.com/hunterhacker/jdom/wiki/JDOM2-Feature-XPath-Upgrade

+0

优秀点。我越来越多的这个项目乞求脱离过时的软件,我肯定会在这里使用这些资源来制作我的案例。谢谢! – JHarnach

+0

rolfl-使用简单/普通查询时,发现jdom1 XPath存在性能问题。 (例如:/ root/child1/sub2/blah,其中doc中只有1个节点是/ root/child1/sub2,以及该节点的许多'blah'子节点)查看jdom代码,发现在DefaultLocationPath.evaluate(...)中,它在返回之前对查询的结果进行排序。这种情况是占据大部分执行时间的。你能告诉我我可以做什么来避免那里发生的分类吗? –

+0

嗨特雷弗。合适的人要问的是Jaxen民众,而不是JDOM。另一方面,排序依赖于在'兄弟'(blah's)上创建迭代器的很多事情。 JDOM 2.x具有更快的迭代器概念,因此它比JDOM 1.x更快。如果你想讨论这个细节,你应该注册jdom-interest邮件列表或者jaxen malining list。那些是正确的论坛.... – rolfl