c# - File.AppendText 或 File.WriteAllText 首先存储在 StringBuilder 中,哪个资源消耗更少、速度更快?

标签 c# performance streamwriter .net

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

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 的性能提升微乎其微,而且在某些系统上实际上会降低性能。

关于c# - File.AppendText 或 File.WriteAllText 首先存储在 StringBuilder 中,哪个资源消耗更少、速度更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16191591/

相关文章:

c# - 我希望能够通过网络从 BIOS 中提取错误日志

python - 对 Pandas 数据框中的每一行进行排序的最快方法

c# - 如何使用 StreamWriter 编辑/替换 .txt 文件中的特定值?

c# - 从 URL 到流的图像

c# - 从数据库中获取记录

C#,如何防止用户更改文件夹权限?

android - 同步联系人 firebase

python - Numpy dot() 和数组转换性能优化

c# - StreamWriter 所有行到文件

c# using 语句和 StreamWriter