XPathSelectElement vs Descendants

时间:2009-10-27 09:16:25

标签: c# xml linq-to-xml

我想知道在使用简单查询时是否存在任何性能差异:

var x = document.XPathSelectElement("actors/actor")

vs

var x = document.Descendants("actors").Descendants("actor")

4 个答案:

答案 0 :(得分:8)

注意这个

var x = document.Elements("actors").Elements("actor").FirstOrDefault();

相当于你的第一个陈述。

会有性能差异,因为这些方法在幕后做了很多不同的事情。但是,除非处理大型数据集,否则优化纯内存操作有点无意义。如果您正在处理大型数据集,那么您应该测量两种备选方案的性能,而不是试图预测哪一种方案运行得更快。

答案 1 :(得分:4)

答案 2 :(得分:1)

是的,虽然这两行不相同。

需要将XPath最终解析为LINQ表达式,然后执行此操作: -

var x = document.Elements("actors").Elements("actor");

然而,很有可能在内部存储XPath表达式的编译版本,以便使用XPath只花费在一些内部保存的字典中查找字符串所花费的时间。不管是不是这样,我都不知道。

答案 3 :(得分:1)

从我的有限测试中,性能似乎非常相似。我从http://msdn.microsoft.com/en-us/library/windows/desktop/ms762271(v=vs.85).aspx

获取了一个示例XML消息

XPath:

/book[id='bk109']

LINQ查询:

from bookElement in xmlElement.Descendants( "book" )
where bookElement.Attribute( "id" ).Value == "bk109"
select bookElement
然后我执行了10,000次(不包括解析字符串所花费的时间和第一次运行以消除CLR噪声)。

结果(100,000次迭代)

  • XElement上的XPath: 60.7 ms
  • XElement上的LINQ to XML: 85.6 ms
  • XPathDocument上的XPath: 43.7 ms

因此,似乎至少在某些情况下,对XElement的XPath评估比LINQ to XML更好。 XPathDocument上的XPath评估甚至更快。

但是,加载XPathDocument似乎需要比加载XDocument(1000次迭代)更长的时间:

  • 加载XPathDocument的时间: 92.3 ms
  • 加载XDocument的时间: 81.0 ms