StringBuilder против XmlTextWriter - PullRequest
9 голосов
/ 19 марта 2010

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

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

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

У кого-нибудь есть опыт из первых рук?

Ответы [ 4 ]

12 голосов
/ 19 марта 2010

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

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, а другой метод - нет.

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

6 голосов
/ 11 июля 2012

Я согласен, что XmlWriter лучше для поддержки кода, но если мы говорим об оптимизации производительности, вам следует избегать как XmlWriter, так и StringBuilder.AppendFormat, потому что использование форматера снижает производительность.

меняется

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

до

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

делает версию StringBuilder в 2,5 раза быстрее, чем другая из ответа Роберта.

2 голосов
/ 19 марта 2010

Когда SOMEVALUE содержит & или <, такой подход приведет к неприятностям. Используйте xml-осведомленные классы для создания xml. Прочитайте HOWTO Избегайте называться Bozo при создании XML .

1 голос
/ 19 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...