J'optimise un utilitaire personnalisé de sérialisation objet -> XML, et tout est fait et fonctionne et ce n'est pas le problème.
Il fonctionnait en chargeant un fichier dans un XmlDocument
puis en passant récursivement par tous les nœuds enfants.
Je me suis dit que peut-être en utilisant XmlReader
au lieu d'avoir XmlDocument
charger/parser le tout serait plus rapide, donc j'ai implémenté cette version aussi.
Les algorithmes sont exactement les mêmes, j'utilise une classe d'enveloppe pour rendre abstraite la fonctionnalité de traitement d'une XmlNode
contre un XmlReader
. Par exemple, le GetChildren
retourne soit un enfant XmlNode
ou un SubTree XmlReader
.
J'ai donc écrit un pilote de test pour tester les deux versions, en utilisant un ensemble de données non triviales (un fichier XML de 900kb avec environ 1.350 éléments).
Cependant, en utilisant JetBrains dotTRACE, je constate que le programme XmlReader
est en fait plus lente que la version XmlDocument
version ! Il semble qu'il y ait un traitement significatif impliqué dans XmlReader
lire les appels lorsque je suis en itération sur les nœuds enfants.
Je dis tout ça pour demander ceci :
Quels sont les avantages/inconvénients de XmlDocument
y XmlReader
et dans quelles circonstances devez-vous utiliser l'un ou l'autre ?
Je pense qu'il y a un seuil de taille de fichier auquel XmlReader
devient plus économique en termes de performances, ainsi que moins gourmand en mémoire. Toutefois, ce seuil semble se situer au-dessus de 1 Mo.
J'appelle ReadSubTree
à chaque fois pour traiter les noeuds enfants :
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);
}
}
Ce test s'applique à un grand nombre d'objets à un seul niveau (c'est-à-dire large et peu profond) - mais je me demande à quel point le test est efficace. XmlReader
les tarifs lorsque le XML est profond et large ? Le XML que je traite ressemble beaucoup à un modèle d'objet de données, un objet parent pour de nombreux objets enfants, etc : 1..M..M..M
Je ne connais pas non plus à l'avance la structure du XML que j'analyse, je ne peux donc pas l'optimiser.