C# 向StringBuilder添加多个字符串的方法中,哪种更快?

C# 向StringBuilder添加多个字符串的方法中,哪种更快?,c#,.net,string,C#,.net,String,我有一个StringBuilder,我需要在其中添加许多短字符串。至少有两种方法。首先,分别添加每个字符串: StringBuilder sb = new StringBuilder (); sb.Append (str1); sb.Append (str2); ..... sb.Append (strN); 第二种方法是将所有字符串相加: sb.Append (string.Concat (str1, str2, ..., strN); 其中哪一种使用起来更快更可取? 注意:这个操作将在我

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

StringBuilder sb = new StringBuilder ();
sb.Append (str1);
sb.Append (str2);
.....
sb.Append (strN);
第二种方法是将所有字符串相加:

sb.Append (string.Concat (str1, str2, ..., strN);
其中哪一种使用起来更快更可取?
注意:这个操作将在我的程序中执行很多次(在循环中),我不知道,我是否应该通过string.Concat创建这么多字符串,这样它们就不会再被使用了。

我会说第一个,因为第二个是为

Concat
创建一个临时
字符串

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

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

sb有y-1字符的空间

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

在第二种情况下,Concat缓冲区的大小正确,因此可以将字符串中的
y
字符复制到Concat缓冲区,再加上
x
字符从旧的sb缓冲区复制到新的sb缓冲区(因为由于单次追加,sb知道在追加之前必须调整大小),从Concat缓冲区向新sb缓冲区添加
y
。所以
x+2y
。第一种方法应以
1
字符获胜

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

int totalLength = str1.Length + str2.Length...

sb.EnsureCapacity(sb.Length + totalLength);

sb.Append(str1);
sb.Append(str2);
sb.Append(str3);
等等

这样,您可以复制大约
x+y
个字符

首先确保
sb
具有足够的容量,然后开始添加字符串


但我们所说的是过早优化,除非您的程序“千次”完成这项工作。

性能不应基于猜测-您应该测试这些事情。特别是,它很可能受到以下因素的影响:

  • 您正在使用的框架版本
  • 字符串数(N)
  • 字符串的大小
  • 字符串的顺序(先是大字符串还是先是小字符串?)
  • 可能还有很多我已经忘记的事情
如果您不需要
StringBuilder
的话,我希望
String.Concat在这里会更快,否则它可以计算出所需的确切缓冲区大小,分配一次,然后复制<代码>StringBuilder
可能需要多次重新分配。缺点是,如果N很大,它也会创建一个数组。编辑:我最初误读了这个问题,没有发现
String.Concat的结果正在另一个
Append
操作中使用。您能否在单个
String.Concat
调用中编写整个操作,而不是将
StringBuilder
String.Concat
混合使用

但是是的,基本上你应该:

  • 决定你实际需要的速度
  • 编写可读性最高的代码
  • 基准测试
  • 仅当速度不够快时才更改为其他代码

您在这方面做过基准测试吗?您自己做基准测试怎么样?