2013-07-19 83 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