XPathSelectElement против потомков - PullRequest
8 голосов
/ 27 октября 2009

Мне было интересно, есть ли различия в производительности при использовании простых запросов в виде:

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

vs

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

Ответы [ 4 ]

8 голосов
/ 27 октября 2009

Обратите внимание, что это

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

эквивалент вашего первого утверждения.

Будет разница в производительности, потому что методы делают разные вещи под капотом. Тем не менее, оптимизация только операций в памяти немного бессмысленна, если вы не имеете дело с большим набором данных. Если вы имеете дело с большим набором данных, вам следует измерить производительность обеих альтернатив, а не пытаться предсказать, какой из них будет работать быстрее.

4 голосов
/ 03 июня 2011

Похоже, что есть хит, кто-то другой сделал работу по сравнительному анализу: http://blog.dreamlabsolutions.com/post/2008/12/04/LINQ-to-XML-and-LINQ-to-XML-with-XPath-performance-review.aspx

1 голос
/ 13 сентября 2012

Из моего ограниченного тестирования производительность кажется очень похожей. Я взял образец XML-сообщения от http://msdn.microsoft.com/en-us/library/windows/desktop/ms762271(v=vs.85).aspx

XPath:

/book[id='bk109']

LINQ запрос:

from bookElement in xmlElement.Descendants( "book" )
where bookElement.Attribute( "id" ).Value == "bk109"
select bookElement

Затем я выполнял каждые 10000 раз (исключая время, необходимое для анализа строки и первого запуска для устранения шума CLR).

Результаты (100 000 итераций)

  • XPath на XElement: 60,7 мс
  • LINQ to XML в XElement: 85,6 мс
  • XPath на XPathDocument: 43,7 мс

Итак, похоже, что по крайней мере в некоторых сценариях оценка XPath на XElement работает лучше, чем LINQ to XML. Оценка XPath в XPathDocument еще быстрее.

Но, похоже, что загрузка XPathDocument занимает немного больше времени, чем загрузка XDocument (1000 итераций):

  • Время загрузки XPathDocument: 92,3 мс
  • Время загрузки XDocument: 81,0 мс
1 голос
/ 27 октября 2009

Да, будет, хотя две строки не эквивалентны.

В конечном итоге XPath необходимо проанализировать в выражении LINQ, которое затем сделает следующее: -

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

Однако вполне возможно, что внутренне скомпилированная версия выражения XPath сохраняется, так что использование XPath стоит только времени, которое требуется для поиска строки в каком-то внутреннем словаре. Так ли это на самом деле или нет, я не знаю.

...