Sto ottimizzando un oggetto personalizzato -> XML serialization utility, e tutto è fatto e funzionante e non è questo il problema.Decidere su quando utilizzare XmlDocument contro XmlReader
Ha funzionato caricando un file in un oggetto XmlDocument
, quindi passando in modo ricorsivo attraverso tutti i nodi figlio.
Ho pensato che forse usando XmlReader
invece di avere caricare/analizzare l'intera cosa sarebbe più veloce, così ho implementato anche quella versione.
Gli algoritmi sono esattamente gli stessi, io uso una classe wrapper per astrarre la funzionalità di gestire uno XmlNode
rispetto a XmlReader
. Ad esempio, i metodi GetChildren
restituiscono un figlio XmlNode
o un sottotabella XmlReader
.
Così ho scritto un test driver per testare entrambe le versioni e utilizzare un set di dati non banale (un file XML 900kb con circa 1.350 elementi).
Tuttavia, utilizzando JetBrains dotTRACE, vedo che la versione XmlReader
è in realtà più lenta della versione XmlDocument
! Sembra che ci sia qualche significativa elaborazione coinvolta nelle chiamate di lettura XmlReader
quando sto iterando su nodi figlio.
Così dico tutto ciò che a chiedere questo:
quali sono i vantaggi/svantaggi di XmlDocument
e XmlReader
, e in quali circostanze si deve utilizzare uno?
La mia ipotesi è che ci sia una soglia di dimensione del file in cui XmlReader
diventa più economico in termini di prestazioni, nonché una minore quantità di memoria. Tuttavia, tale soglia sembra essere superiore a 1 MB.
sto chiamando ReadSubTree
ogni tempo per elaborare i nodi secondari:
public override IEnumerable<IXmlSourceProvider> GetChildren()
{
XmlReader xr = myXmlSource.ReadSubtree();
// skip past the current element
xr.Read();
while (xr.Read())
{
if (xr.NodeType != XmlNodeType.Element) continue;
yield return new XmlReaderXmlSourceProvider (xr);
}
}
Questo test è applicabile a un sacco di oggetti a livello di singola (cioè un'ampia & poco profondo) - ma mi chiedo come ben XmlReader
tariffe quando l'XML è profondo & largo? Cioè l'XML che sto trattando è molto simile a un modello di oggetto dati, 1 oggetto genitore a molti oggetti figlio, ecc: 1..M..M..M
Inoltre non conosco in anticipo la struttura dell'XML che sto analizzando, quindi posso ottimizzare per questo.
Mi sono sempre chiesto perché c'era sia un XmlDocument che un XmlReader ... –
In realtà esiste un'altra opzione per XMLDocument e XMLReader. Ora puoi utilizzare LINQ in XML, ma in realtà XMLReader è più efficiente in molti modi. – Tarik
Attendi. Il metodo 'GetChildren' restituisce un' XmlReader'? Vuoi dire, stai chiamando 'XmlReader.Create()' ogni volta che elabori un nodo figlio? –