C# StringBuilder确实比串联十几个字符串慢吗?

C# StringBuilder确实比串联十几个字符串慢吗?,c#,.net,string,stringbuilder,C#,.net,String,Stringbuilder,StringBuilder确实比串联十几个字符串慢吗? 编译器如何优化字符串连接,以便使用“+”连接十几个字符串比使用StringBuilder更好 本·沃森(Ben Watson)在一本书中写道: 字符串连接:用于已知(编译时)字符串的简单连接 时间)字符串的数量,只需使用“+”运算符或 Concat方法。这通常比使用 StringBuilder。字符串结果=a+b+c+d+e+f;不要 考虑StringBuilder,直到字符串的数目是可变的 可能比几十个大。编译器将优化简单的 字符串串联可

StringBuilder确实比串联十几个字符串慢吗? 编译器如何优化字符串连接,以便使用“+”连接十几个字符串比使用StringBuilder更好

本·沃森(Ben Watson)在一本书中写道:

字符串连接:用于已知(编译时)字符串的简单连接 时间)字符串的数量,只需使用“+”运算符或 Concat方法。这通常比使用 StringBuilder。字符串结果=a+b+c+d+e+f;不要 考虑StringBuilder,直到字符串的数目是可变的 可能比几十个大。编译器将优化简单的 字符串串联可以减少内存开销


String.Concat更有效,因为它从一开始就知道所有字符串的长度。因此,它可以分配一个长度刚好合适的缓冲区,将字符串复制到其中并返回该缓冲区

StringBuilder
必须分配一个小的缓冲区,每次调用
Append
都会重新分配和复制缓冲区,导致其空间不足。最后一次调用
ToString()
还必须分配另一个缓冲区

因此,当您事先知道有多少字符串时,请使用
String.Concat
;如果不需要,请使用
StringBuilder


在C#中,对+运算符的链式调用会自动转换为对
字符串的单个调用。Concat

直接concatation需要更少的对象和内存调用。因此,如果将所有字符串(不进行任何文本处理)合并到一条语句中,速度会更快

在这种情况下,编译器可以计算新字符串的大小,分配内存并将所有字符复制到其中。因此,只创建所需的对象

如果使用的是StringBuilder,则会使用其他对象。如果附加长字符串而不告诉构造函数中的StringBuilder使用巨大的缓冲区大小,字符串生成器可能会执行多个内存分配和复制,因为它可能会在标准内存分配上运行多次

如果在循环中构建字符串,则StringBuild是更好的解决方案。在这种情况下,直接关联将在每次迭代中创建一个新的对象和内存分配,其中StringBuild只使用一个内存分配(如果在构造函数中使用正确的值)和两个对象


但很难说出运行时的一些情况。随着时间的推移,实现会发生变化。因此,现在的最佳做法可能是5年来最糟糕的做法。

为了清晰起见,请写下。如果您有性能目标,请编写清晰的代码,然后对照这些目标进行度量。如果它遇到了他们,那就太好了。如果没有,请查看如何在代码中重新编写实际的热点。不要以为你能学到10亿条小“性能”规则,然后盲目地应用于所有代码编写并获得良好的性能。@JonSkeet啊,我没有发现我在
字符串
标记中,而不是
java
。另一方面,如果某些模式比其他模式更有效,为什么不从它们开始(假设它们同样清晰)?如果您连接字符串常量,编译器将已经执行连接。