我每秒收到大约 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/