2013-07-19 85 views
2

我在使用XPath時遇到了有關性能問題的問題。XPath性能 - 哪個更好?

哪一個更好?爲什麼? (在當然的性能情況下):

//A/B/C[@id="x"]/../.. 

//A[B/C[@id="x"]] 
+0

爲什麼不嘗試兩種方法並查看哪種方法在您的環境中最好(您沒有多告訴我們)以及您的數據? – mirod

回答

3

如果有的話,你會得到通過//擊中性能......它是可能的處理器是不會以優化這樣的表達,並且會浪費時間尋找A元素作爲C元素的後代,因爲你正在問它。我在課堂上強調這是XSLT處理中性能低下的最常見原因之一(我每次看到它在StackOverflow問題中被濫用,但我會花一整天的時間討論它,因爲它經常被使用) 。

至於A/B/C[@id='x']/../..A[B/C[@id="x"]]之間的差異,它取決於處理器是否將優化器重寫爲優化的一部分(因爲它是聲明性的)。

如果沒有這樣的優化發生,前者會比後者慢,因爲前者要求處理器花費時間來收集所有元素,並將樹備份到樹的每個元素的祖父元素上。後者表達式使用的謂詞是作爲節點集的數據類型的布爾型true()/ false()測試,並且處理器知道返回的布爾值在第一次檢測到這種情況時爲true()並且不需要查找任何其他C元素(並且不應該在尋找任何其他C元素)。

+0

謝謝你的回答。你能否更具體地瞭解第二個表達式是如何評估的?我不太明白這一點。確切地說,使用true()/ false()的謂詞在哪裏?在'A'元素上? – sebast26

+0

按定義,謂詞是一個「有效布爾值」表達式,用true()/ false()結果評估,如果結果爲false(),則該項目將從地址列表中丟棄。如果結果爲true(),則該項目在地址列表中維護。謂詞'B/C [@ id ='x']'的數據類型是一個節點集。節點集合的有效布爾值對於空節點集合爲false(),對於非空節點集合爲true()。當處理器確定第一個項目時,節點集合不爲空,則不需要再查找該值是否爲真()。 –

+0

所以如果我正確理解你,因爲在第二個查詢中我們使用謂詞「B/C [@ id =」x「]''處理器有適當的節點設置在某處/準備好了,並且不需要收集所有' 'C''元素和散步備份樹聯合在第一個查詢? – sebast26