String与StringBuilder - zLulus/My_Note GitHub Wiki

摘抄自C# String与StringBuilder

如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如当在一个循环中将许多字符串连接在一起时,使用StringBuilder类可以提升性能。
对字符串添加或删除操作不频繁的话,就几个固定的string累加的时候就不需要StringBuilder了,毕竟StringBuilder的初始化也是需要时间的。对字符串添加或删除操作比较频繁的话那就用StringBuilder。

String a1 = "abc";  //分配固定的内存大小
a1+="def";  //创建新的内存分配a1,代价比较昂贵

StringBuilder sb = new StringBuilder(20);  //指定分配大小
sb.Append('abc');  //分配到堆区
sb.Append('def');  //不会被销毁,而是直接追加到后面。

做了一个测试

var count = 100000;
var addStr = "1234567890";
Stopwatch stopwatch = new Stopwatch();

stopwatch.Start();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < count; i++)
{
	stringBuilder.Append(addStr);
}
var a = stringBuilder.ToString();
stopwatch.Stop();
var t1= stopwatch.ElapsedMilliseconds;
Console.WriteLine($"StringBuilder耗时:{t1}");

stopwatch.Restart();
var s = "";
for (int i = 0; i < count; i++)
{
	s += addStr;
}
stopwatch.Stop();
var t2 = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"String耗时:{t2}");

结果差距非常大,StringBuilder耗时为2,String耗时32784左右

示例代码

UseStringDemo