【发布时间】:2017-04-14 23:53:15
【问题描述】:
鉴于 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);
}
为什么写入磁盘比在内存中附加字符串快得多?我知道添加到一个字符串需要将整个字符串复制到一个新的内存位置,但是添加一个字符串比写入磁盘要慢几个数量级,这似乎违反直觉。
【问题讨论】:
-
这似乎不是真正的代码,因为您没有将项目添加到列表中。
-
每个
+操作都会创建一个新字符串(这需要分配内存)。请改用StringBuilder。 -
@MikeS159:除了可能的
IndexOutOfBoundException,这个简单的字符串连接不会导致任何明显的性能问题。你是怎么测量的?我猜大部分工作都是在getProtocol -
@TimSchmelter 如果您认为简单的字符串连接不会导致性能问题,那么您在字符串操作方面似乎还没有做太多工作。这是一个时间和空间上的 O(n^2) 操作。
标签: c# string streamwriter