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")
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")
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.
Ah, questo è giusto. Esattamente quello che dovevo sapere. Grazie! – Mattias
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
@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
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.
Lettura interessante. Grazie! – Mattias
Sembra che ci sia un successo, qualcun altro ha fatto la noia di benchmarking: http://blog.dreamlabsolutions.com/post/2008/12/04/LINQ-to-XML-and-LINQ-to-XML-with-XPath-performance-review.aspx
Penso che il benchmarking sia un po 'errato in quanto confronta le espressioni XPath con l'accesso ai discendenti diretti. –
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)
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):
'XPathDocument' produce un ingombro di memoria molto grande per documenti XML non banali. –
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". –