2009-10-27 1 views
8

mi chiedevo se ci sono delle differenze di prestazioni quando si utilizza semplici domande come:XPathSelectElement vs Discendenti

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

vs 

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

nota a margine: le risposte a questa domanda ignorare http://stackoverflow.com/questions/3705020/what-is-the-difference-between- linq-to-xml-descendants-and-elements - la seconda query restituirà nodi come "/ foo/actor/random_nodes/actor" a differenza del primo che restituisce solo "actor" che è figlio immediato di "attori". –

risposta

8

Si noti che questo

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

è l'equivalente della vostra prima dichiarazione.

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 a meno che non si abbia 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 piuttosto che cercare di prevedere quale sarà più veloce.

+0

Ah, questo è giusto. Esattamente quello che dovevo sapere. Grazie! – Mattias

+0

eccetto che lavora con enormi file xml (come 1gig o più grande) - quindi potrebbe voler fare un benchmark (dovrebbe dare un'occhiata a come scrivere un microbenchmark corretto: http://stackoverflow.com/questions/504103/how -do-i-write-a-corretto-micro-benchmark-in-java) – user181750

+0

@Christian: C'è qualche prova che l'uso di XPathSelectElement abbia una differenza di prestazioni "minuscola". Non sto dicendo che non è vero ma come è noto. L'unico modo in cui potrebbe essere minuscolo è se l'espressione XPath risultante viene compilata e memorizzata nella cache. Questo vale per XPath nel System.Xml ma è lo stesso in Linq-To-Xml? C'è qualche documentazione o blog del team MS o alcuni test comparativi pubblicati sul web che lo confermano? – AnthonyWJones

1

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

La XPath deve essere analizzato in definitiva in un'espressione LINQ che poi farlo: -

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

Tuttavia è del tutto possibile che internamente una versione compilata dell'espressione XPath viene memorizzato in modo che utilizzando solo un XPath costa il tempo necessario per cercare la stringa in alcuni dizionari interni. Che sia effettivamente il caso o no, non lo so.

+0

Lettura interessante. Grazie! – Mattias

1

Dal mio limitato di test, le prestazioni sembra molto simile. 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 poi eseguita ogni 10.000 volte (escluso il tempo necessario per analizzare la stringa e la prima eseguire per eliminare il rumore CLR).

Risultati (100.000 iterazioni)

  • XPath su XElement: 60,7 ms
  • LINQ to XML 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 su XML. Le valutazioni XPath su XPathDocument sono ancora più veloci.

Ma, sembra che il caricamento di un XPathDocument prende un po 'più lungo di caricamento di un XDocument (1000 iterazioni):

  • tempo per caricare XPathDocument: 92.3 ms
  • tempo per caricare XDocument: 81,0 ms
+0

'XPathDocument' produce un ingombro di memoria molto grande per documenti XML non banali. –