我有一个关于使用 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
元素并步行备份结合每个祖父元素的树。而后一个表达式使用的谓词是对节点集的数据类型的 bool 值 true()/false() 测试,并且处理器知道返回的 bool 值是 true() 在第一次检测到这样的C
元素,不需要寻找任何其他 C
元素(并且不应该寻找任何其他 C
元素)。
关于performance - XPath 性能——哪一个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17748496/