String与StringBuilder - zLulus/My_Note GitHub Wiki
如果要修改字符串而不创建新的对象,则可以使用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左右