標準の文字列メソッド、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の方が速い場合もあれば、かなり遅い場合もあります。明らかなことは、文字列の使用は比較してはるかに遅いということです。