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

cae*_*say 12 c# string

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

StringBuilder是否使用更多内存?作为一个附注,字符串构建器本质上做了哪些不同的事情,使它更快?

Jam*_*acs 16

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

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

var result = str1 + str2 + str3 + ... + strN;
Run Code Online (Sandbox Code Playgroud)

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

  • 我相信你的结尾段落的前几句话是不正确的.以这种方式连接多个字符串的单行将,除非我错了,编译为单个`string.Concat`调用,它为结果字符串分配足够的空间一次,而不需要像你建议的那样执行多次重新分配. (5认同)

Dan*_*Tao 16

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

如果您确实知道在编译时要组合的字符串,那么StringBuilder基本上没有意义,因为您不需要其动态调整大小功能.

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

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


kd7*_*kd7 5

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