XPath性能 - 哪个更好?

时间:2013-07-19 14:22:55

标签: performance xpath

使用XPath时,我对性能问题有疑问。

哪一个更好,为什么? (如果是表演的话):

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

VS

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

1 个答案:

答案 0 :(得分:3)

如果有的话,使用//会对性能产生影响...处理器可能不会优化这样的表达式,并且会浪费时间寻找A元素C元素的后代,因为你要求它。我在课堂上强调这是XSLT处理中表现不佳的最常见原因之一(每当我看到它在StackOverflow问题中被滥用时我都会感到畏缩,但我会花一整天时间来讨论它,因为它经常被使用)

至于A/B/C[@id='x']/../..A[B/C[@id="x"]]之间的区别,它取决于处理器是否将前者重写为后者作为优化的一部分(因为它是声明性的)。

如果没有这样的优化发生,前者将比后者慢,因为前者要求处理器花时间收集所有C个元素并在树上行走备份联合每个元素的祖父元素。而后一个表达式使用谓词,该谓词是对作为节点集的数据类型的布尔值true()/ false()测试,并且处理器在第一次检测到这样的情况时知道返回的布尔值为true() C元素,不需要查找任何其他C元素(也不应该查找任何其他C元素。)