使用XPath时,我对性能问题有疑问。
哪一个更好,为什么? (如果是表演的话):
//A/B/C[@id="x"]/../..
VS
//A[B/C[@id="x"]]
答案 0 :(得分:3)
如果有的话,使用//
会对性能产生影响...处理器可能不会优化这样的表达式,并且会浪费时间寻找A
元素C
元素的后代,因为你要求它。我在课堂上强调这是XSLT处理中表现不佳的最常见原因之一(每当我看到它在StackOverflow问题中被滥用时我都会感到畏缩,但我会花一整天时间来讨论它,因为它经常被使用)
至于A/B/C[@id='x']/../..
和A[B/C[@id="x"]]
之间的区别,它取决于处理器是否将前者重写为后者作为优化的一部分(因为它是声明性的)。
如果没有这样的优化发生,前者将比后者慢,因为前者要求处理器花时间收集所有C
个元素并在树上行走备份联合每个元素的祖父元素。而后一个表达式使用谓词,该谓词是对作为节点集的数据类型的布尔值true()/ false()测试,并且处理器在第一次检测到这样的情况时知道返回的布尔值为true() C
元素,不需要查找任何其他C
元素(也不应该查找任何其他C
元素。)