将哪些字符串添加到StringBuilder的方法更快?

时间:2011-10-25 09:58:01

标签: c# .net string

我有一个StringBuilder,我需要添加许多短字符串。至少有两种方式。首先是分别添加每个字符串:

StringBuilder sb = new StringBuilder ();
sb.Append (str1);
sb.Append (str2);
.....
sb.Append (strN);

第二个是将所有字符串添加到一起:

sb.Append (string.Concat (str1, str2, ..., strN);

哪一种更快,更适合使用? P.S。:该操作将在我的程序中执行多次(在循环中)并且我不知道,我是否应该通过string.Concat创建这么多字符串,以便它们不再被使用。

2 个答案:

答案 0 :(得分:2)

我会说第一个,因为第二个是为string创建一个临时Concat

让我们看看更糟糕的情况:

  

x == sb.Length;
     y ==总和(str 1-n长度)

     

sb有y - 1个字符的空间。

     

在第一种情况下,您将从字符串中复制:y - 1个字符到sb,然后从旧的sb缓冲区复制到新的sb缓冲区x + y - 1,然后复制1个字符。所以x + 2y - 2 + 1个字符,所以x + 2y - 1个字符。

     

在第二种情况下,Concat缓冲区的大小正确,因此您将字符串中的y个字符复制到Concat缓冲区加上x从旧的缓冲区到新的sb缓冲区(因为谢谢单个附加,sb知道他必须在附加之前调整大小),加上来自Concat缓冲区的y到新的sb缓冲区。所以x + 2y。第一种方法应该以{{1​​}}字符获胜。

但如果你真的需要加快速度:

1

等等。

通过这种方式,您可以复制int totalLength = str1.Length + str2.Length... sb.EnsureCapacity(sb.Length + totalLength); sb.Append(str1); sb.Append(str2); sb.Append(str3); 个字符。

首先确保x + y有足够的容量,然后开始添加字符串。

但我们说的是过早优化,除非你的程序“千分之一”做这件事。

答案 1 :(得分:1)

与往常一样,性能不应该基于猜测 - 你应该测试这些东西。特别是,它可能会受到以下因素的影响:

  • 您正在使用的框架版本
  • 字符串数(N)
  • 字符串的大小
  • 字符串的顺序(首先是大的,还是小的?)
  • 可能还有许多我忘记的事情

如果您不需要String.Concat ,我希望 StringBuilder更快,因为它可以解决确切的缓冲区大小,分配一次,然后复制。 StringBuilder可能需要多次重新分配。缺点是如果N很大,它也会创建一个数组。编辑:我最初误解了这个问题,没有发现String.Concat的结果正在另一个Append操作中使用。您能否在一次String.Concat来电中编写整个操作,而不是混合StringBuilderString.Concat

但是,基本上你应该:

  • 决定实际需要它的速度
  • 编写最易读的代码
  • 基准测试
  • 只有在速度不够快的情况下才能更改为其他代码