我正试图从一个提供HttpHandler内容的定制Xml中尽可能多地提高性能。
我想知道哪一个性能更好。使用XmlTextWriter类或即席StringBuilder操作,如:
StringBuilder sb = new StringBuilder("<?xml version="1.0" encoding="UTF-8" ?>");
sb.AppendFormat("<element>{0}</element>", SOMEVALUE);有谁有第一手的经验吗?
发布于 2010-03-20 01:49:38
正如Josh所说,这是一个微优化,如果你还没有证明它的必要性,你甚至不应该考虑它。测试也真的不难:
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毫秒,与通过网络推送这么多数据相比,这段时间变得微不足道。
发布于 2012-07-12 01:20:35
我同意XmlWriter在代码可维护性方面更好,但如果我们讨论的是性能优化,您应该同时避免XmlWriter和StringBuilder.AppendFormat,因为使用格式化程序会破坏性能。
改变
sb.AppendFormat("<element>{0}</element>", content);至
sb.Append("<element>").Append(content).Append("</element>");使StringBuilder版本比罗伯特答案中的其他版本快2.5倍。
发布于 2010-03-19 23:26:56
当SOMEVALUE中包含&或<时,这种方法会给您带来麻烦。使用支持xml的类来生成xml。请阅读HOWTO Avoid Being Called a Bozo When Producing XML。
https://stackoverflow.com/questions/2478427
复制相似问题