2

我有一个关于使用 XPath 时的性能问题的问题。

哪个更好,为什么?(当然是在性能的情况下):

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

对比

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

1 回答 1

5

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

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

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

于 2013-07-19T14:52:55.837 回答