XPath 显式索引筛选器性能

本文关键字:性能 筛选 索引 XPath | 更新日期: 2023-09-27 17:55:43

我正在创建一个xsl stylehseet并提出了这个(在我看来不合逻辑的行为):

此 XPath:

/

root/element[1][@attr1 != '1' or @attr2 != 'test']

比这个XPath慢得多:

/

root/element[count(preceding-sibling::element) + 1 = 1) 和 (@attr1 != '1' or @attr2 != 'test')]

我有 50 个示例 xml,使用第一个 XPath 需要 ~55 秒。
使用第二个 XPath 需要 ~4 秒!

我使用 XslCompiledTransform (C# .NET 4.5)。

有人可以解释为什么第一个 XPath 比第二个慢得多吗?我一直认为最好使用显式索引过滤器。

更新:一些示例 xml:

<?xml version="1.0" encoding="iso-8859-1"?>
<root>
<element attr2="test" attr1="1">
    <child>17</child>
    <child>17</child>
    <child>16</child>
    ...
    <child>3</child>
    <child>2</child>
    <child>1</child>
</element>
<element attr2="test2" attr1="2">
    <child/>
    <child/>
    <child/>
    <child/>
    <child/>
    <child/>
    <child/>
    ...
    <child/>
</element>
....
<element attr2="test21" attr1="21" />

只有 20-25 个元素有 n 个子元素,但最大深度为 4(/root/element/child/otherChild)。

XPath 显式索引筛选器性能

我得出的解决方案是我只需要接受这一点。Microsoft https://support.microsoft.com/en-us/kb/815124 说:

所有版本的 MSXML(版本 3.0 及更高版本)使用显式索引筛选器都更快。性能的提高取决于元素在父元素的子列表中的位置。而不是使用以下方法:

/child_element

使用以下内容:

/child_element[1]

就我而言,第一个例子比微软的推荐要快得多。