Estoy optimizando un objeto personalizado -> utilidad de serialización XML, y todo está hecho y funcionando, y ese no es el problema.Decidir cuándo usar XmlDocument contra XmlReader
Funcionó al cargar un archivo en un objeto XmlDocument
, y luego recursivamente a través de todos los nodos secundarios.
que pensé que tal vez usando XmlReader
en lugar de tener XmlDocument
carga/analizar toda la cosa sería más rápido, por lo que esa versión implementado también.
Los algoritmos son exactamente lo mismo, yo uso una clase contenedora para abstraer la funcionalidad de tratar con un XmlNode
frente a un XmlReader
. Por ejemplo, los métodos GetChildren
dan como resultado un niño XmlNode
o un SubTree XmlReader
.
Así que escribí un controlador de prueba para probar ambas versiones, y el uso de un conjunto de datos no triviales (un archivo XML de 900kb con alrededor de 1.350 elementos).
Sin embargo, usando JetBrains dotTRACE, veo que la versión XmlReader
es en realidad más lenta que la versión XmlDocument
! Parece que hay un procesamiento significativo involucrado en las llamadas de lectura XmlReader
cuando estoy iterando sobre nodos secundarios.
Así que todo lo que dicen que hacen esta:
¿Cuáles son las ventajas/desventajas de XmlDocument
y XmlReader
, y en qué circunstancias debe usted utilizar cualquiera?
Supongo que hay un umbral de tamaño de archivo en el que XmlReader
se vuelve más económico en rendimiento, y requiere menos memoria. Sin embargo, ese umbral parece estar por encima de 1MB.
Voy a llamar cada vez que ReadSubTree
para procesar nodos hijos:
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);
}
}
Esa prueba se aplica a una gran cantidad de objetos en un único nivel (es decir, amplia & superficial) - pero me pregunto qué tan bien cuando XmlReader
tarifas el XML es profundo & ancho? Es decir. el XML que estoy tratando es muy similar a un modelo de objeto de datos, 1 objeto principal a muchos objetos secundarios, etc. 1..M..M..M
Tampoco sé de antemano la estructura del XML que estoy analizando, entonces puedo optimizar para ello.
Siempre me he preguntado por qué había un XmlDocument y un XmlReader ... –
En realidad, hay otra opción para XMLDocument y XMLReader. Ahora puede usar LINQ to XML pero en realidad XMLReader es más eficiente en la mayoría de los sentidos. – Tarik
Espera. Su método 'GetChildren' devuelve' XmlReader' ¿Quiere decir que llama a 'XmlReader.Create()' cada vez que procesa un nodo secundario? –