代码之家  ›  专栏  ›  技术社区  ›  caesay

StringBuilder使用的内存是否多于字符串串联?

  •  11
  • caesay  · 技术社区  · 14 年前

    我知道使用StringBuilder的明显性能优势在C中,但是内存的区别是什么?

    StringBuilder是否使用更多内存?作为一个旁注,StringBuilder在本质上做了什么不同的事情,使得它更快?

    3 回复  |  直到 14 年前
        1
  •  16
  •   Dan Tao    14 年前

    简短回答: StringBuilder 在您连接任意数量的字符串(您在编译时不知道)的情况下是合适的。

    如果你 知道在编译时要组合哪些字符串, 字符串拼接 基本上是没有意义的,因为您不需要它的动态大小调整功能。

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

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

        2
  •  16
  •   James Kovacs    14 年前

    StringBuilder不一定更快。我记得,如果字符串的具体化少于12个,那么字符串的具体化(eiether via string.concat或simple str1+str2)实际上更快。原因是StringBuilder的分配和初始化实际上需要时间。

    StringBuilder速度更快的原因是它创建了一个内部缓冲区,并将字符串添加到该缓冲区中。如果要连接20个字符串,StringBuilder只需将一个接一个的字符串附加到其缓冲区,并在请求时最终返回结果-通过其ToString()方法。(我假设有足够的缓冲空间。否则,StringBuilder会担心重新分配缓冲区,并有一些启发式方法来帮助缓冲区不重新分配太多次。)如果您是连接字符串,则每个字符串连接都会分配一个新的长度字符串(str1.length+str2.length),并将第一个和第二个字符串复制到适当的位置。这导致了大量字符串的重新复制。

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

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

        3
  •  5
  •   Ta01    14 年前

    我认为你真的应该读这个: The Sad Tragedy of Micro-Optimization Theater ,您对StringBuilder v/s concat的回答,跳跃后