C# 记录到内存,然后写入文件,比较内存流和文件

C# 记录到内存,然后写入文件,比较内存流和文件,c#,performance,file-io,io,stream,C#,Performance,File Io,Io,Stream,这是关于我之前的问题,实际上是那个问题的编辑部分,我在编辑部分问,如果我写到内存中,会比写到文件快吗?我做了一个简单的测试,结果令人震惊!我想与社区分享。 这是代码 private void Button1Click(object sender, EventArgs e) { var stopwatch = new Stopwatch(); stopwatch.Start(); File.AppendAllText(@"D:\File1.txt", string.Form

这是关于我之前的问题,实际上是那个问题的编辑部分,我在编辑部分问,如果我写到内存中,会比写到文件快吗?我做了一个简单的测试,结果令人震惊!我想与社区分享。 这是代码

private void Button1Click(object sender, EventArgs e)
{
    var stopwatch = new Stopwatch();
    stopwatch.Start();
    File.AppendAllText(@"D:\File1.txt", string.Format("{0}Start! : {1}", Environment.NewLine, DateTime.Now.ToString(CultureInfo.InvariantCulture)));
    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j < 1000000; j++)
        {
             File.AppendAllText(@"D:\File1.txt", string.Format("{0}{1}:{2}", Environment.NewLine, i.ToString(CultureInfo.InvariantCulture), j.ToString(CultureInfo.InvariantCulture)));
         }
    }
    File.AppendAllText(@"D:\File1.txt", string.Format("{0}Done!{1}", Environment.NewLine, DateTime.Now.ToString(CultureInfo.InvariantCulture)));
    stopwatch.Stop();
    File.AppendAllText(@"D:\File1.txt",
                       string.Format("{0}{1}:{2}",Environment.NewLine,              stopwatch.Elapsed.ToString(), stopwatch.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture)));
    MessageBox.Show("Done!");
}

private void Button2Click(object sender, EventArgs e)
{
     var stopwatch = new Stopwatch();
     using (var mem = new MemoryStream())
     {
         using (var binaryWriter = new BinaryWriter(mem))
         {
             stopwatch.Start();
             {
                 binaryWriter.Write("start! : " + DateTime.Now.ToString(CultureInfo.InvariantCulture));
                 for (int i = 0; i < 6; i++)
                 {
                     for (int j = 0; j < 1000000; j++)
                     {
                         binaryWriter.Write(i.ToString(CultureInfo.InvariantCulture) + ":" + j.ToString(CultureInfo.InvariantCulture));
                     }
                 }
                 stopwatch.Stop();
                 binaryWriter.Write("Done! " + DateTime.Now.ToString(CultureInfo.InvariantCulture));
                 binaryWriter.Write(stopwatch.Elapsed.ToString() + ":" + stopwatch.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture));
                 binaryWriter.Flush();
                 var file = new FileStream(@"D:\File2.txt", FileMode.Create);
                 mem.WriteTo(file);
             }
         }
     }
     MessageBox.Show("Done!");
}

所以,正如你自己所看到的,大约有50分钟的差异如果您将所有内容直接记录到IO文件中,而不使用内存流或任何自定义工具进行记录,则这可能是性能不好的真正原因。与50分钟的文件相比,使用MemoryStream只需4.25秒。(我仍然不明白为什么windows资源管理器中显示的时间与stopwatch.ShowElapasedTime最后显示在文件中的时间不一致,但尽管如此,即使我们看到windows资源管理器时间,它仍然快了大约45分钟!)因此,这可能是一件非常有用的事情,我想分享它

这是因为File.AppendAllText打开文件、写入、刷新缓冲区并关闭它。如果您保持日志文件处于打开状态,并使用流(而不是MemoryStream)对其进行写入,您将得到与MemoryStream非常接近的结果—甚至可能无法区分


试试看。

对于大量数据,直接写入磁盘的速度可能会快很多,因为它不需要在内存中重新分配巨型阵列(这也会导致内存不足异常)。如果指定更大的缓冲区(高达64K左右),直接写入文件的速度几乎肯定会更快当你打开文件时。或者,您可以使用连接到输出流的
BufferedStream
。这只是IO做错了的结果。@harold这里怎么了?IO是分块工作的,上面有流,以便更易于管理。结果之一是,编写一个小程序块所需的时间与编写一个大程序块所需的时间差不多。使用流,所有的短写操作都可以连接并写入一个大的块中。使用
AppendAllText
,它只需写出您现在给它的任何内容,因为无法保证您会再次调用它。您已经有了流代码,也可以将其用于文件。
Elapsed time in File1.txt = 00:50:24.5654918  
Elapsed milliseconds in File1.txt = 3024565  
Elapsed time in File2.txt = 00:00:04.7430152  
Elapsed milliseconds in File2.txt = 4743