时间:2019-03-08 标签:c#stringbuilderperformance

c# stringbuilder performance

我有一个大约 50k 次迭代的 for 循环。 这样做效率更高吗:

Stringbuilder sb = new Stringbuilder();
for(int i = 0; i<50000; i++)
   {
      sb.Clear();
      sb.Append("test") //Add everytime 9 different string even from parameters
      string s = sb.ToString();
}

或者这样更高效:

for(int i = 0; i<50000; i++)
{
   Stringbuilder sb = new Stringbuilder();
   sb.Append("..."); //the same like above
   string s = sb.ToString();
}

所以我的问题是:在每个循环中重新初始化 Stringbuilder 是更快还是使用 Stringbuilder.Clear() 函数更好? 或者在我的情况下,字符串中有 9 个不同的值更好地连接字符串?

此致!

第一种方法应该更高效,因为它(至少)减少了 2 倍 拨款。在任何情况下每次迭代都会分配一个 string 个实例,但不需要每次都实例化一个新的 StringBuilder

实际上,除非您手动指定初始容量(并指定足够大的容量),否则第二种方法每次迭代会分配更多的内存。否则 StringBuilder 可能必须分配几个额外的块(每次都将其容量加倍)。

由于调用 StringBuilder.Clear() 只是重置当前长度,已经分配的块不是 Clear() trimmed/collected,所以下一次迭代将已经准备好缓冲区,并且 "probably" 大小合适。

我刚刚测试了你的代码:

  • 第一个循环需要 1 ms
  • 第二个循环需要 3 ms