StringBuilder与XmlTextWriter

我试图从提供Xml内容的自定义HttpHandler中尽可能多地提高性能。

我想知道哪个更好的性能。 使用XmlTextWriter类或ad-hoc StringBuilder操作,如:

StringBuilder sb = new StringBuilder(""); sb.AppendFormat("{0}", SOMEVALUE); 

有没有人有第一手经验?

正如约什所说,这是一个微观优化,如果你没有certificate它的必要性,你甚至不应该考虑。 测试也非常困难:

 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("{0}", 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,而另一种方法则不然。

但是这两种方法在我两年前的笔记本电脑上在大约60毫秒内创建了100,000个元素的XML文档,与通过网络推送大量数据所花费的时间相比,这个时间缩短为无足轻重。

我同意XmlWriter更适合代码可维护性,但如果我们讨论性能优化,则应该避免使用XmlWriter和StringBuilder.AppendFormat,因为使用formatter破坏了性能。

改变

 sb.AppendFormat("{0}", content); 

 sb.Append("").Append(content).Append(""); 

使StringBuilder版本比Robert的答案快2.5倍。

SOMEVALUE有一个&< in,这种方法会让你陷入困境。 使用xml-aware类生成xml。 阅读HOWTO避免在生成XML时被称为Bozo 。

老实说,直到你真的,真的,真的,真的, 真的需要关心性能……不要。

首先使用更易维护的解决方案,只有在性能成为可衡量的问题时才会妥协。 XmlTextWriter为您提供“了解”Xml应该如何工作的好处。 StringBuilder没有,因此容易出错。 您不想花一天时间在粗糙的stringbuilder代码中的某个位置跟踪格式错误的节点。

让框架为您服务。