XPath 显式索引过滤器性能

Ton*_*ony 5 c# xml xslt performance xpath

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

这个 XPath:

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

比这个 XPath 慢得多:

/root/element[count(preceding-sibling::element) + 1 = 1) and (@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" />
Run Code Online (Sandbox Code Playgroud)

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

Ton*_*ony 0

我得出的解决方案是我必须接受这一点。微软说https://support.microsoft.com/en-us/kb/815124

使用显式索引过滤器,MSXML 的所有版本(3.0 版及更高版本)的速度都会更快。性能的提高取决于元素在父级子列表中的位置。而不是使用以下内容:

/子元素

使用以下内容:

/子元素[1]

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