我知道使用StringBuilder的明显性能优势在于C#,但是内存的区别是什么?
StringBuilder是否使用更多内存?作为旁注,stringbuilder本质上做了哪些不同的事情,使得它更快?
答案 0 :(得分:16)
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,每个字符串只复制到内部缓冲区一次,假设缓冲区足够大以容纳各个字符串。
答案 1 :(得分:16)
简短回答:StringBuilder
适用于连接任意数量的字符串的情况,这些字符串在编译时是您不知道的。
如果你做知道你在编译时合并了哪些字符串,StringBuilder
基本没有意义,因为你不需要它的动态调整大小功能。
示例1:您想要组合“cat”,“dog”和“mouse”。这正好是11个字符。您可以简单地分配一个长度为11的char[]
数组,并用这些字符串中的字符填充它。这基本上是string.Concat
的作用。
示例2:您希望将未指定数量的用户提供的字符串连接到单个字符串中。由于要连接的数据量是事先未知的,因此在这种情况下使用StringBuilder
是合适的。
答案 2 :(得分:5)
我认为你真的应该读这个:The Sad Tragedy of Micro-Optimization Theater,你的回答是StringBuilder v / s Concat,跳转之后