现在项目中用的Log输出机制, 都是使用StringBuilder进行字符串拼接的, 那么为什么要使用StringBuilder进行字符串拼接呢?
一开始是这样的:
private string content;
public void log(string text)
{
content += text;
}
public void log2File(string filename)
{
File.WriteAllText(filename, content);
}
后来发现, 当运行一段时间之后, 会发生偶现的卡顿现象,分析热点后发现在log处
假设系统之前已经产生了1万条Log, 每条Log是100个字节, 在Log高峰时每秒产生50条Log
那么会是什么结果?
首先content 的大小为 10000* 100 = 976KB
那么输出50个Log, 会产生: (976KB+100B)+(976KB+100B+100B)+...+(976KB+100B*50) ≈ 50M
也就是说, 输出50条100字节的Log, 会产生50M内存数据的移动
如果之前曾经产生过10万条Log, 就会生产500M内存数据的移动!!!
这个问题其实很简单, 但是如果不小心踩到了, 就是个坑, 正确方法是这样:
private StringBuilder content;
public void log(string text)
{
content.Append(text);
}
public void log2File(string filename)
{
File.WriteAllText(filename, content);
}