StringBuilder по сравнению с XmlTextWriter

Я пытаюсь сжать столько производительности, сколько я могу от пользовательского HttpHandler, который обслуживает содержание XML.

Я задаюсь вопросом, который лучше для производительности. Используя класс XmlTextWriter или специальные операции StringBuilder как:

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

У кого-либо есть собственный опыт?

9
задан 19 March 2010 в 15:26
поделиться

3 ответа

Как сказал Джош, это микрооптимизация, которую вам даже не следует рассматривать, если вы не доказали ее необходимость. Это также действительно несложно проверить:

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

Версия XmlWriter не только постоянно быстрее на одну-две миллисекунды, но и создает правильно сформированный XML, чего не делает другой метод.

Но оба метода создают XML-документы из 100 000 элементов примерно за 60 миллисекунд на моем ноутбуке двухлетней давности, время, которое становится несущественным по сравнению со временем, необходимым для передачи такого количества данных по сети.

13
ответ дан 4 December 2019 в 09:12
поделиться

Честно говоря, пока вы действительно, действительно, действительно, действительно, действительно не должны заботиться о производительности ... не надо.

Сначала используйте более удобное в обслуживании решение и идите на компромисс только тогда, когда производительность становится измеримой проблемой. XmlTextWriter предлагает вам возможность «знать» о том, как должен работать Xml. StringBuilder этого не делает и поэтому подвержен ошибкам. Вы же не хотите тратить день на отслеживание уродливого узла где-нибудь в вашем корявом коде конструктора строк.

Позвольте структуре работать на вас.

1
ответ дан 4 December 2019 в 09:12
поделиться

Когда в SOMEVALUE есть & или <, этот подход приведет вас к проблемам. Используйте xml-aware классы для генерации xml. Почитайте статью HOWTO Avoid Being Called a Bozo When Producing XML.

2
ответ дан 4 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: