2010-03-19 16 views
8

Sto provando a spremere più prestazioni che posso da un HttpHandler personalizzato che serve contenuti Xml.StringBuilder vs XmlTextWriter

Mi chiedo quale sia il migliore per le prestazioni. Utilizzando la classe XmlTextWriter o ad-hoc operazioni StringBuilder come:

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

Qualcuno ha esperienza di prima mano?

risposta

12

Come ha detto Josh, questa è una micro-ottimizzazione che non dovresti nemmeno prendere in considerazione se non hai dimostrato la sua necessità. E 'anche molto difficile da testare:

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(); 
} 

Non solo è la versione XmlWriter costantemente più veloce per un millesimo di secondo o due, produce XML ben formato, che l'altro metodo non lo fa.

Ma entrambi i metodi stanno creando documenti XML di 100.000 elementi in circa 60 millisecondi sul mio computer portatile di due anni, una quantità di tempo che si riduce ad essere irrilevante rispetto al tempo necessario per spingere tanti dati sulla rete .

+0

Impressionante lavoro. In realtà ho fatto questa stessa cosa sulla mia macchina e stavo tornando qui per pubblicare i risultati, ma mi hai battuto al punch. I miei risultati sono essenzialmente uguali a quelli che hai trovato. +1 – Josh

+0

Sono d'accordo che XmlWriter è migliore, ma se stiamo parlando di ottimizzazione, string.Format non è un modo per andare. sb.Append ("") .Append (contenuto) .Append (""); rende la versione di StringBuilder 2,5 volte più veloce dell'altra. –

1

Onestamente fino a quando davvero, davvero, davvero, davvero, davvero è necessario preoccuparsi delle prestazioni ... no.

Per prima cosa, scegli la soluzione più manutenibile e comprometti solo quando le prestazioni diventano un problema misurabile. XmlTextWriter ti offre il vantaggio di "Sapere" su come Xml dovrebbe funzionare. StringBuilder non lo fa, ed è quindi soggetto a errori. Non vuoi trascorrere un giorno rintracciare un nodo malformato da qualche parte nel tuo codice gnarly per il builder.

Lascia che il framework funzioni per te.

+0

Parte dell'Xml serve alcuni file flash, quindi abbiamo inviato l'INTERA struttura del contenuto al client per ogni richiesta. Quindi sì, ci interessa davvero le prestazioni. –

+0

Questa è la micro-ottimizzazione però ... qual è la percentuale complessiva di tempo di elaborazione rispetto a dire ... latenza di rete? Sono disposto a scommettere che tra tutti i posti in cui potresti ottenere dei guadagni in termini di prestazioni, questo ti farà guadagnare il minimo ROI. Ancora una volta, è necessario eseguire alcune misurazioni e ottimizzare l'intera pipeline, non solo un aspetto minuscolo. – Josh

+0

È vero, siamo al punto in cui stiamo decidendo se scrivere i file xml su disco e lasciare che il caching client/server prenda il sopravvento. Questo sarebbe il più efficiente, ma ci presenta una serie di problemi completamente nuovi, quindi lasciamolo per un'altra domanda. –

2

Quando SOMEVALUE ha un & o < in esso, questo approccio ti porterà nei guai. Utilizzare le classi che riconoscono xml per generare xml. Leggere il numero HOWTO Avoid Being Called a Bozo When Producing XML.

+0

Grazie per il feedback, ma sono a conoscenza dei problemi associati all'approccio StringBuilder.Abbiamo classi di utilità per evitare correttamente caratteri come & e <>. La mia domanda riguardava specificamente le prestazioni. –

6

Sono d'accordo che XmlWriter è migliore per la manutenibilità del codice, ma se si parla di ottimizzazione delle prestazioni, si dovrebbe evitare sia XmlWriter che StringBuilder.AppendFormat, perché l'utilizzo di un formattatore rovina le prestazioni.

cambiando

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

a

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

rende la versione StringBuilder 2,5 volte più veloce poi l'altro dalla risposta di Robert.