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