我必须将数千个动态生成的行写入文本文件。
我有两个选择,哪个消耗更少的资源,并且比另一个更快?
A.使用StringBuilder和File.WriteAllText
StringBuilder sb = new StringBuilder();
foreach(Data dataItem in Datas)
{
sb.AppendLine(
String.Format(
"{0}, {1}-{2}",
dataItem.Property1,
dataItem.Property2,
dataItem.Property3));
}
File.WriteAllText("C:\\example.txt", sb.ToString(), new UTF8Encoding(false));
B.使用File.AppendText
using(StreamWriter sw = File.AppendText("C:\\example.txt"))
{
foreach (Data dataItem in Datas)
{
sw.WriteLine(
String.Format(
"{0}, {1}-{2}",
dataItem.Property1,
dataItem.Property2,
dataItem.Property3));
}
}
最佳答案
您的第一个版本将所有内容放入StringBuilder
然后进行写入,它将占用最多的内存。如果文本很大,则可能会耗尽内存。它有可能更快,但也可能会更慢。
第二个选项将使用更少的内存(基本上只使用StreamWriter
缓冲区),并且性能会很好。我会推荐这个选项。它的性能很好-可能比第一种方法更好-并且没有相同的潜力来耗尽内存。
通过增加输出缓冲区的大小,可以大大提高速度。而不是
File.AppendText("filename")
使用以下命令创建流:
const int BufferSize = 65536; // 64 Kilobytes
StreamWriter sw = new StreamWriter("filename", true, Encoding.UTF8, BufferSize);
64K的缓冲区大小比默认的4K缓冲区大小提供了更好的性能。您可以更大一些,但是我发现大于64K可以带来最小的性能提升,并且在某些系统上实际上会降低性能。