Question

Je me demandais s'il existait des différences de performances lors de l'utilisation de requêtes simples en tant que:

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

vs

var x = document.Descendants("actors").Descendants("actor")
Était-ce utile?

La solution

Notez que cette

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

est l'équivalent de votre première déclaration.

Il y aura une différence de performance, car les méthodes font des choses très différentes sous le capot. Cependant, l'optimisation des opérations purement en mémoire est un peu inutile à moins de traiter un grand ensemble de données. Si vous traitez avec un ensemble de données volumineux, vous devez alors mesurer les performances des deux alternatives plutôt que d'essayer de prédire celle qui fonctionnera plus rapidement.

Autres conseils

On dirait qu'il y a un succès, quelqu'un d'autre a déjà fait le travail d'analyse comparative: http://blog.dreamlabsolutions.com/post/2008/12/04/LINQ-to-XML-and-LINQ-to-XML-with-XPath-performance-review.aspx

Oui, il y en aura bien que les deux lignes ne soient pas équivalentes.

Le XPath doit être finalement analysé dans une expression LINQ qui ferait alors ceci: -

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

Cependant, il est tout à fait possible qu'une version compilée de l'expression XPath soit stockée en interne, de sorte que l'utilisation d'un XPath ne coûte que le temps nécessaire à la recherche de la chaîne dans un dictionnaire en interne. Je ne sais pas si c'est le cas ou non.

D'après mes tests limités, les performances semblent très similaires. J'ai pris un exemple de message XML de http : //msdn.microsoft.com/en-us/library/windows/desktop/ms762271 (v = vs.85) .aspx

XPath:

/book[id='bk109']

Requête LINQ:

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

Je me suis ensuite exécuté 10 000 fois (à l’exception du temps nécessaire pour analyser la chaîne et de la première exécution pour éliminer le bruit CLR).

Résultats (100 000 itérations)

  • XPath sur XElement: 60,7 ms
  • LINQ to XML sur XElement: 85,6 ms
  • XPath sur XPathDocument: 43,7 ms

Il semble donc qu'au moins dans certains scénarios, l'évaluation XPath sur XElement fonctionne mieux que LINQ to XML. Les évaluations XPath sur XPathDocument sont encore plus rapides.

Cependant, il apparaît que le chargement d'un XPathDocument prend un peu plus de temps que celui d'un XDocument (1 000 itérations):

  • Il est temps de charger XPathDocument: 92,3 ms
  • Il est temps de charger XDocument: 81,0 ms
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top