2010-03-19 17 views
8

Estoy tratando de obtener el máximo rendimiento posible de un HttpHandler personalizado que sirve contenido Xml.StringBuilder vs XmlTextWriter

Me pregunto cuál es mejor para el rendimiento. Utilización de la clase XmlTextWriter o ad-hoc operaciones StringBuilder como:

StringBuilder sb = new StringBuilder("<?xml version="1.0" encoding="UTF-8" ?>");  
sb.AppendFormat("<element>{0}</element>", SOMEVALUE); 

¿Alguien tiene experiencia de primera mano?

Respuesta

12

Como dijo Josh, se trata de una micro-optimización que ni siquiera debería considerar si no ha demostrado su necesidad. También en realidad no es difícil de probar:

static void Main(string[] arguments) 
{ 
    const int iterations = 100000; 

    Stopwatch sw = new Stopwatch(); 
    sw.Start(); 
    string s = CreateUsingStringBuilder("content", iterations); 
    sw.Stop(); 
    Console.WriteLine(String.Format("CreateUsingStringBuilder: {0}", sw.ElapsedMilliseconds)); 

    sw.Reset(); 
    sw.Start(); 
    s = CreateUsingXmlWriter("content", iterations); 
    sw.Stop(); 
    Console.WriteLine(String.Format("CreateUsingXmlWriter: {0}", sw.ElapsedMilliseconds)); 

    Console.ReadKey(); 
} 

private static string CreateUsingStringBuilder(string content, int iterations) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < iterations; i++) 
     sb.AppendFormat("<element>{0}</element>", content); 

    return sb.ToString(); 
} 

private static string CreateUsingXmlWriter(string content, int iterations) 
{ 
    StringBuilder sb = new StringBuilder(); 
    using (StringWriter sw = new StringWriter(sb)) 
    using (XmlWriter xw = XmlWriter.Create(sw)) 
    { 
     xw.WriteStartElement("root"); 
     for (int i = 0; i < iterations; i++) 
      xw.WriteElementString("element", content); 
     xw.WriteEndElement(); 
    } 
    return sb.ToString(); 
} 

No sólo es la versión XmlWriter consistentemente más rápido por una milésima de segundo o dos, produce XML bien formado, que el otro método no lo hace.

Pero ambos métodos crean documentos XML de 100,000 elementos en aproximadamente 60 milisegundos en mi computadora portátil de dos años, una cantidad de tiempo que se reduce a insignificancia en comparación con el tiempo que se tardará en enviar tantos datos a través de la red .

+0

Awesome Job. De hecho, hice lo mismo en mi máquina y regresé aquí para publicar los resultados, pero me ganaste al golpe. Mis resultados son esencialmente los mismos que has encontrado. +1 – Josh

+0

Acepto que XmlWriter es mejor, pero si hablamos de optimización, string.Format no es un camino por recorrer. sb.Append ("") .Append (content) .Append (""); hace que la versión de StringBuilder sea 2.5 veces más rápida que la otra. –

1

Honestamente hasta que realmente, realmente, realmente, realmente necesita preocuparse por el rendimiento ... no.

Vaya primero con la solución más fácil de mantener, y solo comprometa cuando el rendimiento se convierte en un problema mensurable. XmlTextWriter le ofrece el beneficio de "Saber" sobre cómo se supone que Xml funciona. StringBuilder no lo hace y, por lo tanto, es propenso a errores. No desea pasar un día rastreando un nodo malformado en algún lugar de su código de generador de cuerdas retorcido.

Deje que el marco funcione para usted.

+0

Parte del xml sirve para algunos archivos flash, por lo que hemos enviado toda la estructura de contenido al cliente en cada solicitud. Entonces sí, realmente nos importa el rendimiento. –

+0

Sin embargo, esto es una micro-optimización ... ¿cuál es el porcentaje total de tiempo de cómputo en comparación con decir ... latencia de red? Estoy dispuesto a apostar que de todos los lugares en los que podrías obtener algunas ganancias de rendimiento, esto te generará el ROI mínimo. Una vez más, debe hacer una medición real y optimizar toda la tubería, no solo un pequeño aspecto de ella. – Josh

+0

Es cierto que estamos en un punto en el que decidimos escribir los archivos xml en el disco y dejar que el almacenamiento en caché del cliente/servidor tome el control. Este sería el más eficiente, pero nos presenta un nuevo conjunto de problemas, así que dejémoslo para otra pregunta. –

2

Cuando SOMEVALUE tiene & o < en él, este enfoque le causará problemas. Use las clases xml-aware para generar xml. Tener una lectura de HOWTO Avoid Being Called a Bozo When Producing XML.

+0

Gracias por los comentarios, pero estoy al tanto de los problemas asociados con el enfoque de StringBuilder.Tenemos clases de utilidad para escapar correctamente de caracteres como & y <>. Mi pregunta era específicamente sobre el rendimiento. –

6

Estoy de acuerdo en que XmlWriter es mejor para el mantenimiento del código, pero si hablamos de optimización del rendimiento, debe evitar tanto XmlWriter como StringBuilder.AppendFormat, ya que el uso de un formateador arruina el rendimiento.

cambiar

sb.AppendFormat("<element>{0}</element>", content); 

a

sb.Append("<element>").Append(content).Append("</element>"); 

hace que la versión StringBuilder 2,5 veces más rápido que el otro de la respuesta de Robert.