Я провел несколько тестов, используя ваш стандартный строковый метод, метод класса 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 быстрее, а иногда довольно медленнее. Ясно, что использование строк намного медленнее по сравнению.