鉴于 RAM 比硬盘驱动器快得多,我对下面的代码感到惊讶。
我试图根据一列的值拆分 CSV 文件,并将该单元格中具有不同值的每一行写入不同的文件。
我在尝试:
List<string> protocolTypes = new List<string>();
List<string> splitByProtocol = new List<string>();
foreach (string s in lineSplit)
{
string protocol = getProtocol();
index = protocolTypes.IndexOf(protocol);
splitByProtocol[index] = splitByProtocol[index] + s + "\n";
}
这需要很长时间,但将其更改为流写入器要快得多:
List<string> protocolTypes = new List<string>();
List<StreamWriter> splitByProtocol = new List<StreamWriter>();
foreach (string s in lineSplit)
{
string protocol = getProtocol();
index = protocolTypes.IndexOf(protocol);
splitByProtocol[index].WriteLine(s);
}
为什么写入磁盘比在内存中将字符串附加在一起快得多?我知道添加到一个字符串需要将整个字符串复制到一个新的内存位置,但是添加一个字符串比写入磁盘要慢几个数量级,这似乎违反直觉。
最佳答案
如果字符串变得很大(很多 MB),那么复制它们肯定会变得很耗时。
然而,最大的打击可能是由许多不再需要的旧字符串造成的,它们作为垃圾堆放在堆上,等待被收集。所以垃圾收集器会启动,甚至可能启动很多次,每次都会暂停您的程序。
对于像这样在循环中构造的字符串,请始终考虑使用 StringBuilder
。匹配您的示例代码:
List<StringBuilder> splitByProtocol = new List<StringBuilder>();
foreach (string s in lineSplit)
{
string protocol = getProtocol();
index = protocolTypes.IndexOf(protocol);
splitByProtocol[index].AppendLine(s);
}
关于c# - 为什么写入文件比附加字符串更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40892076/