【问题标题】:Performance of XPath vs DOMXPath 与 DOM 的性能
【发布时间】:2011-07-13 21:08:36
【问题描述】:

哪位大神能帮我做一下XPath和DOM在不同场景下的综合性能对比?我读过一些类似xPath vs DOM API, which one has a better performanceXPath or querySelector? 的问题。他们都没有提到具体案例。这是我可以开始做的事情。

  1. 不涉及迭代。 getElementById(foobar) 与 //*[@id='foobar']。前者总是比后者快吗?如果后者被优化怎么办,例如/html/body/div[@id='foo']/div[@id='foobar']?
  2. 涉及迭代。 getElementByX 然后遍历子节点 vs XPath 生成快照然后遍历快照项。
  3. 涉及轴。 getElementByX 然后遍历下一个兄弟姐妹 vs //following-sibling::foobar。
  4. 不同的实现。不同的浏览器和库以不同的方式实现 XPath 和 DOM。哪个浏览器的 XPath 实现更好?

正如xPath vs DOM API, which one has a better performance 中的答案所说,普通程序员在以 DOM 方式实现复杂任务(例如涉及多个轴)时可能会搞砸,而 XPath 保证得到优化。因此,我的问题只关心可以通过两种方式完成的简单选择。

感谢您的任何评论。

【问题讨论】:

  • 与几乎所有关于性能和优化的问题一样,这将取决于您的具体情况和内容。答案是“使用您的数据分析您的应用程序,然后选择最适合您的应用程序”。另外,你问了太多一般性的问题。这可能应该作为“不是一个真正的问题”而结束,如果其他人这么认为,我会和他们一起投票。
  • 我个人的经验是,DOM 通常比 XPath 或选择器 API 实现(例如 Firefox)快 10 倍以上。然而,由于 XPath 接受上下文节点,也许最好选择一个带有 DOM 的“稳定”父节点,并使用 XPath 来完成其余的工作。这可以是高性能和强大的。
  • XPath 可以构建在非 DOM API 之上,例如 vtd-xml 的 xpath 实现是构建在虚拟令牌描述符之上的......

标签: performance dom xpath


【解决方案1】:

XPath 和 DOM 都是规范,而不是实现。你不能问关于规范性能的问题,只能问具体的实现。快速 XPath 引擎和慢速 XPath 引擎之间至少存在十比一的差异:它们可能针对不同的事物进行优化,例如有些人花费大量时间优化查询,假设它将被执行多次,这对于单次执行可能是错误的。可以说的一件事是,XPath 的性能更多地取决于您使用的引擎,而 DOM 的性能更多地取决于应用程序程序员的能力,因为它是一个较低级别的接口。当然,所有程序员都认为自己比一般人好得多……

【讨论】:

  • 最常见的实现如何:Firefox、Chrome、IE、Opera?我认为他们以相当平衡的方式优化引擎。在这样的假设下,这个问题有答案吗?
【解决方案2】:

我同意 Michael 的观点,这可能取决于实现,但我通常会说 DOM 更快。原因是我认为您无法优化已解析的文档以使 XPath 更快。

如果您正在遍历 HTML 而不是 XML,专门的解析器能够索引文档中的所有 id 和类。这将使 getElementById 和 getElementsByClass 更快。

使用 XPath,只有一种方法可以找到该 id 的元素...通过自上而下或自下而上的遍历。您可能能够记忆重复查询(或部分查询),但我没有看到任何其他可以完成的优化。

【讨论】:

  • 看不到任何优化的事实意味着您没有认真思考或阅读广泛。
【解决方案3】:

此页面有一个部分,您可以在其中运行测试以比较两者并在不同的浏览器中查看结果。例如,对于 Chrome,xpath 比 getElementById 慢 100%。

更多信息请参见getElementById vs QuerySelector

【讨论】:

  • 嗨克劳迪乌,欢迎来到 StackOverflow!虽然您发布的链接可能会有所帮助,但 StackOverflow 的目标是成为未来几年的知识库,以便访问此页面的其他人可以从您的回答中受益。如果链接断开,您的答案将毫无用处。考虑编辑您的答案以包含链接中的示例,这样如果链接失效,您的答案就有价值。祝你好运,欢迎来到 StackOverflow! :)
  • 我继续进行了一些改进。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2013-05-16
  • 2013-06-17
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多