Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XPath显式索引过滤器性能_C#_Xml_Performance_Xslt_Xpath - Fatal编程技术网

C# XPath显式索引过滤器性能

C# XPath显式索引过滤器性能,c#,xml,performance,xslt,xpath,C#,Xml,Performance,Xslt,Xpath,我正在创建一个xsl样式表,并提出了以下建议(在我看来,这是不合逻辑的行为): 此XPath: /根/元素[1][@attr1!=“1”或@attr2!=“测试”] 比这个XPath慢得多: /根/元素[计数(前面的同级::元素)+1=1)和(@attr1!=“1”或@attr2!=“test”)] 我有50个xml示例,使用第一个XPath大约需要55秒。 使用第二个XPath需要~4秒 我使用XslCompiledTransform(C#.NET 4.5) 有人能解释为什么第一个XPath比

我正在创建一个xsl样式表,并提出了以下建议(在我看来,这是不合逻辑的行为):

此XPath:

/根/元素[1][@attr1!=“1”或@attr2!=“测试”]

比这个XPath慢得多:

/根/元素[计数(前面的同级::元素)+1=1)和(@attr1!=“1”或@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" />

17
17
16
...
3.
2.
1.
...
....


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

我得出了一个解决方案,我必须接受这个。 微软表示:

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

/子元素

使用以下命令:

/子元素[1]


在我的例子中,第一个例子比微软的推荐要快得多。

这当然令人惊讶。但我不会用“不合逻辑”这个词。根下的元素子元素数量是否很大?在这种情况下,可能第一个表达式正在查看所有元素,而第二个表达式在第一个匹配后停止(表达式是否在只需要第一个匹配的上下文中使用?)我添加了一些示例xml,也许您可以解释为什么带有显式过滤器的XPath比带有计数的XPath慢得多抱歉,我不知道微软XPath处理器的内部结构,所以我无法解释它的优化策略。