C# XPath显式索引过滤器性能
我正在创建一个xsl样式表,并提出了以下建议(在我看来,这是不合逻辑的行为): 此XPath: /根/元素[1][@attr1!=“1”或@attr2!=“测试”] 比这个XPath慢得多: /根/元素[计数(前面的同级::元素)+1=1)和(@attr1!=“1”或@attr2!=“test”)] 我有50个xml示例,使用第一个XPath大约需要55秒。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比
使用第二个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处理器的内部结构,所以我无法解释它的优化策略。