StringBuilder或+ =

ped*_*uiz 10 .net stringbuilder string-concatenation

我每秒收到大约5条消息.它们中的每一个都有一个字符串,我将其连接到一个包含所有收到的消息的主字符串

    string _masterText = "";
    public void AddNewMessage(string text)  // this is going to be call at least 5 times/second
    {
        _masterText += text;    
    }
Run Code Online (Sandbox Code Playgroud)

这是合适的方式吗?或者我应该使用StringBuilder,如:

    StringBuilder _masterText = new StringBuilder();
    public void AddNewMessage(string text) // this is going to be call at least 5 times/second
    {
         _masterText.Append(text);  
    }
Run Code Online (Sandbox Code Playgroud)

谢谢

Joe*_*orn 14

StringBuilder通常被认为是更好的选择,但在这种情况下我不使用它.

即使使用StringBuilder,基于该速率的基础字符缓冲区很快就会大到足以卡在大对象堆上.这将导致需要保持运行一段时间的应用程序的运行状况出现问题.

相反,我会使用a System.Collections.Generic.List<string>.Add()为每条新消息调用它的方法.根据您对这些消息的处理方式,您可能还会发现另一种集合类型更合适(可能是a Queue<string>),但这是您应该采用的方向.通过使用集合,每个单独字符串使用的内存不会计入集合对象的大小.相反,每个字符串只会为引用添加几个字节.这将需要更长的时间来解决压缩大对象堆的问题.

如果切换到集合后仍有问题,可以使用,并将字符串写入磁盘.这样,您一次在RAM中永远不会有多个字符串.现在,遇到问题的唯一方法是单个字符串是85000字节还是更大.


Joh*_*ers 8

请记住,String该类是不可变的.无法更改字符串.当您"连接"字符串时,您实际上是在创建一个新字符串,并将原始字符串的内容复制到该字符串,然后添加新字符串的内容.

如果你追加大字符串,这会很快开始使用内存.