字符串连接vs String Builder.性能

Jor*_*oba 28 c# string performance

我有一种情况,我需要连接几个字符串,以形成一个类的ID.基本上我只是循环一个列表来获取对象的ToString值,然后连接它们.

foreach (MyObject o in myList)
  result += o.ToString();
Run Code Online (Sandbox Code Playgroud)

该列表预计不会有超过5个元素(虽然它可以但这是一个非常非常边缘的情况)并且通常会有1到3个元素,通常只有一个或两个元素.

什么会更多的性能,保持连接或使用StringBuilder?

StringBuilder bld = new StringBuilder()
foreach (MyObject o in myList)
  bld.Append(o.ToString());
Run Code Online (Sandbox Code Playgroud)

我不确定在最常见的情况下,创建StringBuilder是否会花费比标准串联更多的时间.

这是懒惰的,列表中的项目一旦创建就不会改变,因此在调用时id会被懒惰地构造一次.

作为旁注...我应该使用固定数组而不是List吗?如果我这样做,我会获得任何性能或内存改进吗?(列表仅用作IEnumerable)

问题的一般观点可能是,有多少字符串足以阻止连接并开始构建?

我是否应该费心去测试这种情况呢?

if (myList.Count > 4) 
  ConcatWithStringBuilder(myList);
Run Code Online (Sandbox Code Playgroud)

Dan*_*son 36

通常的答案是字符串连接对于4到8个字符串更有效.这取决于您阅读的博客.

不要编写测试来决定使用哪种方法.如果你不确定它是否会超过魔法限制,那么只需使用StringBuilder.

运行此代码以查看自己的结果:

const int sLen=30, Loops=5000;
DateTime sTime, eTime;
int i;
string sSource = new String('X', sLen);
string sDest = "";
// 
// Time string concatenation.
// 
sTime = DateTime.Now;
for(i=0;i<Loops;i++) sDest += sSource;
eTime = DateTime.Now;
Console.WriteLine("Concatenation took " + (eTime - sTime).TotalSeconds + " seconds.");
// 
// Time StringBuilder.
// 
sTime = DateTime.Now;
System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1));
for(i=0;i<Loops;i++) sb.Append(sSource);
sDest = sb.ToString();
eTime = DateTime.Now;
Console.WriteLine("String Builder took " + (eTime - sTime).TotalSeconds + " seconds.");
// 
// Make the console window stay open
// so that you can see the results when running from the IDE.
// 
Console.WriteLine();
Console.Write("Press Enter to finish ... ");
Console.Read();
Run Code Online (Sandbox Code Playgroud)

参考.http://support.microsoft.com/kb/306822

  • 我认为这个主题存在混淆,这取决于你尊重谁的意见。最重要的是,据我所知,性能差异只有在代码经常被击中并承受大量负载时才会真正明显。 (2认同)

小智 14

我支持保持简单的想法,直到你有充分的理由让它们变得复杂.

对于像2-5元素这样的东西,使用StringBuilder是没有意义的(除非你连续重复这个连接).更好的可读语法"+ ="具有更多价值.

  • 如果你很好奇,为什么不呢? (2认同)

Sar*_*sch 6

为什么你不能直接使用

String.Concat(myList)
Run Code Online (Sandbox Code Playgroud)

而不是重新发明轮子?它具有高性能,但非常简单。
更多信息请访问:http://msdn.microsoft.com/en-us/library/system.string.concat.aspx


Fox*_*ire 5

关于这个问题的更一般的看法可能是,有多少个字符串足以停止连接并开始构建?

这取决于字符串的长度,如果可以预测目标长度,则应将长度提供给StringBuilder构造函数,以及一次或在多个步骤中将它们全部连接起来。

如果您一次将它们连接起来(如s = "A" + "b" + "c" + "d"),那么使用StringBuilder可能就毫无意义。

如果您可以准确预测长度,那么即使对于3个Strings,StringBuilder也会更快。

通常,如果您拥有大约5个以上的concat,则StringBuilder会更快。但是即使那样,连接字符串通常也很少有开销(除非它在紧密的循环中运行)。

当您达到10次连拍时,使用StringBuilder将是有利的。

编辑:只是为了清楚起见:在您的情况下,您应该明确不使用StringBuilder