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
小智 14
我支持保持简单的想法,直到你有充分的理由让它们变得复杂.
对于像2-5元素这样的东西,使用StringBuilder是没有意义的(除非你连续重复这个连接).更好的可读语法"+ ="具有更多价值.
为什么你不能直接使用
String.Concat(myList)
Run Code Online (Sandbox Code Playgroud)
而不是重新发明轮子?它具有高性能,但非常简单。
更多信息请访问:http://msdn.microsoft.com/en-us/library/system.string.concat.aspx
关于这个问题的更一般的看法可能是,有多少个字符串足以停止连接并开始构建?
这取决于字符串的长度,如果可以预测目标长度,则应将长度提供给StringBuilder
构造函数,以及一次或在多个步骤中将它们全部连接起来。
如果您一次将它们连接起来(如s = "A" + "b" + "c" + "d"
),那么使用StringBuilder
可能就毫无意义。
如果您可以准确预测长度,那么即使对于3个Strings,StringBuilder也会更快。
通常,如果您拥有大约5个以上的concat,则StringBuilder会更快。但是即使那样,连接字符串通常也很少有开销(除非它在紧密的循环中运行)。
当您达到10次连拍时,使用StringBuilder
将是有利的。
编辑:只是为了清楚起见:在您的情况下,您应该明确不使用StringBuilder
。