Performance XPath性能-哪一个更好?

Performance XPath性能-哪一个更好?,performance,xpath,Performance,Xpath,我有一个关于使用XPath时的性能问题的问题 哪一个更好,为什么?当然,在履行义务的情况下: //A/B/C[@id="x"]/../.. vs 如果有什么不同的话,您将通过使用//。。。处理器可能不会优化这样一个表达式,并且会浪费时间寻找一个元素作为C元素的后代,因为您要求它这样做。我在课堂上强调了这一点,认为这是XSLT处理中性能低下的最常见原因之一,每次看到它在StackOverflow问题中被滥用,我都会感到畏缩,但我会花一整天的时间来讨论它,因为它被频繁使用 至于A/B/C[@id=

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

哪一个更好,为什么?当然,在履行义务的情况下:

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


如果有什么不同的话,您将通过使用//。。。处理器可能不会优化这样一个表达式,并且会浪费时间寻找一个元素作为C元素的后代,因为您要求它这样做。我在课堂上强调了这一点,认为这是XSLT处理中性能低下的最常见原因之一,每次看到它在StackOverflow问题中被滥用,我都会感到畏缩,但我会花一整天的时间来讨论它,因为它被频繁使用

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


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

如果有,您将通过使用//…获得性能方面的信息。。。处理器可能不会优化这样一个表达式,并且会浪费时间寻找一个元素作为C元素的后代,因为您要求它这样做。我在课堂上强调了这一点,认为这是XSLT处理中性能低下的最常见原因之一,每次看到它在StackOverflow问题中被滥用,我都会感到畏缩,但我会花一整天的时间来讨论它,因为它被频繁使用

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


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

为什么不两种方法都尝试一下,看看哪一种在您的环境中最好,您没有告诉我们关于和使用您的数据的更多信息?为什么不尝试这两种方法,看看哪一种在您的环境中是最好的,您没有告诉我们关于和使用您的数据的更多信息?谢谢您的回答。您能否更具体地说明第二个表达式的计算方式?我不太明白。到底在哪里使用这个谓词true/false?根据定义,谓词是一个有效的布尔值表达式,其计算结果为真/假,如果结果为假,则从寻址列表中丢弃该项。如果结果为真,则项目将保留在地址列表中。谓词B/C[@id='x']的数据类型是一个节点集。节点集的有效布尔值对于空节点集为false,对于非空节点集为true。当处理器使用第一项确定节点集不是空的时,就不需要再寻找任何值来知道该值是否为真。因此,如果我理解正确,因为在第二个查询中,我们使用谓词B/C[@id=x]处理器在某处/以某种方式准备了适当的节点集,并且不需要像第一次查询那样收集所有C元素并遍历备份联合树?正确,但不需要实际准备节点集。一旦处理器找到一个具有该属性的C,它就不需要继续寻找另一个。。。它可以停止并接受元素A被谓词限定。它是否继续,取决于处理器,但编写良好的处理器不会继续查找。它是否创建节点集取决于处理器,但是编写良好的处理器不会,并且只会注意到节点集是非空的,而无需实际承担准备节点集的开销。谢谢您的回答。您能否更具体地说明第二个表达式的计算方式?我不太明白。到底在哪里使用这个谓词true/false?根据定义,谓词是一个有效的布尔值表达式,其计算结果为真/假,如果结果为假,则从寻址列表中丢弃该项。如果结果为真,则项目将保留在已寻址的lis中
T谓词B/C[@id='x']的数据类型是一个节点集。节点集的有效布尔值对于空节点集为false,对于非空节点集为true。当处理器使用第一项确定节点集不是空的时,就不需要再寻找任何值来知道该值是否为真。因此,如果我理解正确,因为在第二个查询中,我们使用谓词B/C[@id=x]处理器在某处/以某种方式准备了适当的节点集,并且不需要像第一次查询那样收集所有C元素并遍历备份联合树?正确,但不需要实际准备节点集。一旦处理器找到一个具有该属性的C,它就不需要继续寻找另一个。。。它可以停止并接受元素A被谓词限定。它是否继续,取决于处理器,但编写良好的处理器不会继续查找。它是否创建节点集取决于处理器,但编写良好的处理器不会,并且只会注意到节点集将是非空的,而不必实际承担准备节点集的开销。
//A[B/C[@id="x"]]