2010-03-19 15 views
8

vs ben Xml içerikleri sunan bir özel HttpHandler dan mümkün olduğunca çok performans sıkmak çalışıyorum.StringBuilder XmlTextWriter

I performans için daha iyi olan merak ediyorum.

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

herkes ilk elden deneyimi var mı: XmlTextWriter sınıf veya ad-hoc StringBuilder operasyonları gibi kullanarak?

cevap

12

Josh dediği gibi, bu onun gerekliliğini ispat değil eğer bile dikkate almamalıdır mikro iyileştirmedir. Bu teste zamanda gerçekten zor değil:

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

sürekli daha hızlı bir milisaniye veya iki tarafından XmlWriter versiyonu Sadece, diğer yöntem değildir, iyi biçimlendirilmiş XML, üretir.

Ancak her iki yöntemde, iki yıllık dizüstü bilgisayarımda yaklaşık 60 milisaniyede 100.000 öğeli XML belgesi oluşturuluyor. Bu, ağ üzerinde bu kadar veriyi iletmek için harcayacağı süreye kıyasla önemsiz bir hale geliyor. .

+0

Harika İş. Aslında bu şeyi makinemde yaptım ve sonuçları göndermek için buraya geliyordum, ama beni yumrukla dövüyordun. Sonuçlarım, esas olarak bulduğunuz ile aynı. +1 – Josh

+0

XmlWriter'in daha iyi olduğunu kabul ediyorum, ancak optimizasyon hakkında konuşuyorsak string.Format gitmek için bir yol değil. sb.Append ("") .Append (content) .Append (""); StringBuilder sürümünü diğerinden 2,5 kat daha hızlı hale getirir. –

1

Gerçekten, gerçekten, gerçekten, gerçekten, gerçekten performansına dikkat etmeniz gerekir.

performans ölçülebilir bir mesele olduğunda ilk daha sürdürülebilir çözümü ve sadece uzlaşma ile gidin. XmlTextWriter size Xml'in nasıl çalıştığıyla ilgili "Bilmeniz" avantajını sunar. StringBuilder yok ve bu nedenle hata eğilimli. Gnarly stringbuilder kodunuzun bir yerinde hatalı biçimlendirilmiş bir düğümü izleyerek bir gün geçirmek istemezsiniz.

sizin için çerçeve çalışmasına izin verin.

+0

Bölüm bazı flash dosyaları vermektedir, bu yüzden her istek üzerine müşteriye TÜM içerik yapısını göndersin. Evet, performansa gerçekten değer veriyoruz. –

+0

Bu, mikro-optimizasyon olsa da ... hesaplama süresinin genel yüzdesi nedir ... ağ gecikmesi? Bazı performans kazanımları elde edebileceğiniz yerlere bahse girerim, bu en az yatırım getirisi elde edersiniz. Yine, bazı gerçek ölçümleri yapmalı ve tüm boru hattını optimize etmelisiniz, sadece küçük bir yönünü değil. – Josh

+0

Doğru, xml dosyalarını diske yazıp yazmayacağımıza ve istemci/sunucu önbelleklemenin devralmasına izin vereceğimize karar verdiğimiz bir noktadayız. Bu en verimli olurdu, ama bizim için yepyeni bir takım sorunlar sunuyor, bu yüzden başka bir soru için bunu bırakalım. –

2

SOMEVALUE İçinde & veya < sahip olduğunda, bu yaklaşım sorun içine alacak. Xml oluşturmak için xml-bilinçli sınıfları kullanın. HOWTO Avoid Being Called a Bozo When Producing XML'un bir okuması var.

+0

Geri bildiriminiz için teşekkürler, ancak StringBuilder yaklaşımıyla ilişkili sorunların farkındayım.& Gibi gibi karakterlerden kaçmak için yardımcı program sınıflarımız var. Sorum, özellikle performans hakkındaydı. –

6

Ben XmlWriter kod Düzeltilebilirlik için daha iyi olduğunu kabul, ama biz performans optimizasyonu bahsediyoruz eğer bir biçimlendirici kullanarak performansını kalıntıları, çünkü, XmlWriter ve StringBuilder.AppendFormat hem kaçınmalıdır.

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

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

2,5 kat daha hızlı Robert'ın cevap diğer ardından StringBuilder versiyonunu yapar

değişen. xml

İlgili konular