2

如果我做对了,/则意味着它右边的节点必须是它左边的节点的直接子节点,例如/ul/li返回 li 项目,它们是作为文档根的 ul 项目的直接子节点。//ul//li返回 li 项,它们是文档中某处的任何 ul 项的后代。

现在:是否/ul/li比 快//ul//li,即使结果集相同?

4

2 回答 2

3

一般来说,是的,当然!

/ul/li最多访问(number_of_ul * number_of_li 个节点),最大深度为 2。//ul//li可能会访问文档中的每个节点

但是,您可能正在使用具有某种索引的文档系统,或者您可能有一个文档,其中最终访问了相同数量的节点,或者其他任何情况,这可能会导致//速度不那么慢或速度不一样或可能甚至比/ul/li. 我猜你也可能有一个超级愚蠢的 XPath 实现,无论如何都会访问每个节点。

您应该描述您的特定场景,而不是询问哪个更快。“这取决于”是答案。

于 2012-05-10T04:33:57.007 回答
2

XPath 可能至少有 50 种实现,它们的性能差异很大,相差几个数量级。因此,在不参考具体实现的情况下询问有关 XPath 性能的问题是没有意义的。

通常给出的建议是尽可能使用特定的路径:/a/b/c/d 比 //d 更好。然而,这个建议并不总是正确的。一些产品将执行 //d 更快,因为它们已经创建索引的麻烦:如果您针对 XML 数据库运行,则尤其如此。此外,性能并不是一切。当您处理像 FpML 这样的复杂词汇表时,一个元素的特定路径很容易是十步,名称平均为 20 个字符,所以这是一个 200 个字符的 XPath,当您弄错时很难发现。程序员的性能比机器性能更重要。

于 2012-05-10T08:56:11.850 回答