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)。
我得出的解决方案是我只需要接受这一点。Microsoft https://support.microsoft.com/en-us/kb/815124 说:
所有版本的 MSXML(版本 3.0 及更高版本)使用显式索引筛选器都更快。性能的提高取决于元素在父元素的子列表中的位置。而不是使用以下方法:
/child_element
使用以下内容:
/child_element[1]
就我而言,第一个例子比微软的推荐要快得多。