我必须将数千个动态生成的行写入文本文件。
我有两个选择,哪个消耗更少的资源,并且比另一个更快?

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可以带来最小的性能提升,并且在某些系统上实际上会降低性能。

10-01 22:13