我使用您的标准字符串方法、StringBuilder 类方法和利用 XDocument 和 XElement 类的方法运行了一些测试。对于短列表,StringBuilder 类获胜,但对于较大的列表,XML 类给出了可比的时间。我使用的测试代码如下:
List<string> list;
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
protected void Page_Load(object sender, EventArgs e)
{
list = Enumerable.Range(0, 15000).Select(i => i.ToString()).ToList();
UsingStrings();
UsingStringBuilder();
UsingXDocument();
}
private void UsingStrings()
{
timer.Reset();
timer.Start();
string beginItemNode = "<Node>";
string endItemNode = "</Node>";
string xml = "<Root>";
foreach (string item in list)
{
xml += beginItemNode + item + endItemNode;
}
xml += "</Root>";
timer.Stop();
Response.Write(string.Format("Strings time:{0}<br />", timer.Elapsed.Ticks));
}
private void UsingStringBuilder()
{
timer.Reset();
timer.Start();
StringBuilder sb = new StringBuilder();
sb.Append("<Root>");
foreach (string item in list)
{
sb.AppendFormat("<Node>{0}</Node>", item);
}
sb.Append("</Root>");
timer.Stop();
Response.Write(string.Format("StringBuilder time:{0}<br />", timer.Elapsed.Ticks));
}
private void UsingXDocument()
{
timer.Reset();
timer.Start();
XDocument xDoc = new XDocument();
xDoc.Add(new XElement("Root"));
foreach (var item in list)
{
XElement element = new XElement("Node", item);
xDoc.Root.Add(element);
}
timer.Stop();
Response.Write(string.Format("XDocument time:{0}<br />", timer.Elapsed.Ticks));
}
上面的测试在我的机器上给出了以下结果:
First run:
Strings time:239750613
StringBuilder time:55509
XDocument time:61904
Second run:
Strings time:289422753
StringBuilder time:198595
XDocument time:80032
如果要将 XDocument XML 显示为不带格式的字符串,请使用:
string xml = xDoc.ToString(SaveOptions.DisableFormatting);
编辑:我最初说 XDocument 要快得多,但运行测试几次似乎它通常等同于 StringBuilder 方法,尽管它似乎更一致,而有时 StringBuilder 更快,其他时候则慢一些。很明显,相比之下使用字符串要慢得多。