2012-05-14 39 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