首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringBuilder或+=

StringBuilder或+=
EN

Stack Overflow用户
提问于 2010-07-29 10:39:19
回答 6查看 1.2K关注 0票数 10

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

代码语言:javascript
复制
    string _masterText = "";
    public void AddNewMessage(string text)  // this is going to be call at least 5 times/second
    {
        _masterText += text;    
    }

这是正确的方法吗?或者我应该使用StringBuilder,比如:

代码语言:javascript
复制
    StringBuilder _masterText = new StringBuilder();
    public void AddNewMessage(string text) // this is going to be call at least 5 times/second
    {
         _masterText.Append(text);  
    }

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-29 10:44:14

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

即使使用StringBuilder,在这种速度下,底层字符缓冲区很快就会变得足够大,从而卡在大对象堆上。这将对需要保持一段时间运行的应用程序的健康状况造成问题。

相反,我会使用System.Collections.Generic.List<string>,并为每条新消息调用它的.Add()方法。根据您对这些消息所做的操作,您可能还会发现另一种集合类型更合适(可能是Queue<string>),但这是您应该走的方向。通过使用集合,每个单独字符串使用的内存将不计入集合对象的大小。取而代之的是,每个字符串只会为引用添加几个字节。这将花费更长的时间来遇到压缩大对象堆的问题。

如果切换到集合后仍然有问题,可以使用流,并将字符串写入磁盘。这样一来,RAM中就不会一次有多个字符串。现在,如果单个字符串大于或等于85000个字节,就会出现问题。

票数 14
EN

Stack Overflow用户

发布于 2010-07-29 10:45:31

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

如果你追加的是大字符串,这会非常快地占用内存。

票数 8
EN

Stack Overflow用户

发布于 2010-07-29 10:41:09

每隔200ms并不是一个非常繁重的投票,不管stringbuilder总是更好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3359109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档