Domanda

Mi chiedevo se ci fossero differenze di rendimento quando si utilizzano query semplici come:

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

vs

var x = document.Descendants("actors").Descendants("actor")
È stato utile?

Soluzione

Nota che questo

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

è l'equivalente della tua prima affermazione.

Ci sarà una differenza di prestazioni, perché i metodi stanno facendo cose molto diverse sotto il cofano. Tuttavia, l'ottimizzazione delle operazioni puramente in memoria è un po 'inutile se non si ha a che fare con un set di dati di grandi dimensioni. Se hai a che fare con un set di dati di grandi dimensioni, dovresti misurare le prestazioni di entrambe le alternative anziché cercare di prevedere quale verrà eseguito più velocemente.

Altri suggerimenti

Sembra che ci sia stato un successo, qualcun altro ha fatto il lavoro di benchmarking: http://blog.dreamlabsolutions.com/post/2008/12/04/LINQ-to-XML-and-LINQ-to-XML-with-XPath-performance-review.aspx

Sì, ci saranno anche se le due linee non sono equivalenti.

L'XPath deve essere analizzato alla fine in un'espressione LINQ che quindi farebbe questo: -

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

Tuttavia è del tutto possibile che al suo interno venga memorizzata una versione compilata dell'espressione XPath in modo che l'utilizzo di un XPath costa solo il tempo necessario per cercare la stringa in un dizionario tenuto internamente. Che sia effettivamente così o no, non lo so.

Dai miei test limitati, le prestazioni sembrano molto simili. Ho preso un messaggio XML di esempio da http : //msdn.microsoft.com/en-us/library/windows/desktop/ms762271 (v = vs.85) aspx

XPath:

/book[id='bk109']

Query LINQ:

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

Ho quindi eseguito ogni 10.000 volte (escluso il tempo impiegato per analizzare la stringa e la prima esecuzione per eliminare il rumore CLR).

Risultati (100.000 iterazioni)

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

Quindi, sembra che almeno in alcuni scenari la valutazione XPath su XElement funzioni meglio di LINQ to XML. Le valutazioni XPath su XPathDocument sono ancora più veloci.

Ma sembra che il caricamento di un XPathDocument impieghi un po 'più di tempo rispetto al caricamento di un XDocument (1000 iterazioni):

  • Tempo per caricare XPathDocument: 92,3 ms
  • Tempo per caricare XDocument: 81,0 ms
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top