StringBuilder使用的内存多于字符串连接吗?

我知道使用StringBuilder的明显性能优势是在C#中,但是内存差异是什么样的呢?

StringBuilder是否使用更多内存? 作为旁注,stringbuilder本质上做了哪些不同的事情,使它更快?

简短回答: StringBuilder适用于连接任意数量的字符串的情况,这些字符串在编译时是您不知道的。

如果您确实知道在编译时要组合的字符串, StringBuilder基本上没有意义,因为您不需要其动态resizefunction。

示例1:您想要组合“cat”,“dog”和“mouse”。 这正好是11个字符。 您可以简单地分配一个长度为11的char[]数组,并用这些字符串中的字符填充它。 这基本上就是string.Concat所做的。

示例2:您希望将未指定数量的用户提供的字符串连接到单个字符串中。 由于要连接的数据量事先是未知的,因此在这种情况下使用StringBuilder是合适的。

StringBuilder不一定更快。 我记得,如果你连接不到十几个字符串,字符串连接(通过String.Concat或简单的str1 + str2)实际上更快。 原因是StringBuilder的分配和初始化实际上需要时间。

StringBuilder更快的原因是它创建了一个内部缓冲区,它添加了字符串。 如果你连接20个字符串,StringBuilder只是一个接一个地附加到它的缓冲区,最后在请求时返回结果 – 通过它的ToString()方法。 (我假设有足够的缓冲区空间。否则StringBuilder担心重新分配缓冲区并具有启发式帮助它不重新分配太多次。)如果你连接字符串,每个字符串concat将分配一个新的字符串length(str1.Length + str2.Length)并将第一个和第二个字符串复制到位。 这导致大量重新复制字符串。

 var result = str1 + str2 + str3 + ... + strN; 

这将需要N-1次分配和N-1次复制操作。 对于大N来说,这可能会变得非常昂贵。另外请注意,您要复制str1 N-1次的内容。 一旦得到str1 + str2的结果。 然后再次得到(str1 + str2)+ str3的结果。 使用StringBuilder,每个字符串仅复制到内部缓冲区一次,假设缓冲区足够大以容纳单个字符串。

我想你真的应该读到这个: 微优化剧院的悲剧悲剧 ,你对StringBuilder v / s Concat的回答,跳跃之后