.net - StringBuilder 或 +=

标签 .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;    
    }

这是适当的方法吗?或者我应该使用 StringBuilder,例如:

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

谢谢

最佳答案

StringBuilder 通常被认为是更好的选择,但在本例中我都不使用。

即使使用 StringBuilder,以这种速度,底层字符缓冲区本身也会很快变得足够大,从而卡在大对象堆上。这会给需要保持运行一段时间的应用程序的健康带来问题。

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

如果切换到集合后仍然遇到问题,您可以使用,并将字符串写入磁盘。这样,RAM 中一次就不会出现多个字符串。现在,唯一遇到问题的情况是单个字符串是否为 85000 字节或更大。

关于.net - StringBuilder 或 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3359109/

相关文章:

.net - Excel VBA 网页抓取 - 自动化错误/未指定错误

MySQL CONCAT 返回带有两个有效字符串的空值

java - StringBuffer setLength 与子字符串

c++ - _bstr_t 连接给出 12142

javascript - 我的 JS 字符串连接不起作用

c# - 如何从 dotnet build 命令获取警告

.net - 如何获取 'codebehind' 文件,以便默认创建 RC1 中的 ASP.NET-MVC View

c# - 将图像缩放到多种尺寸以进行深度缩放

c# - 是否需要在替换 StringBuilder 中的字符串之前进行检查(使用 "Contains"或 "IndexOf"等函数)?

c# - 为什么 StringBuilder Append 方法返回 StringBuilder 对象?