流复制时缓冲区大小的差异

时间:2012-02-18 11:53:32

标签: c# optimization stream buffer

我看到很多CopyStream实现的例子,但是当我们复制流时,我对缓冲区大小有疑问 CopyStreams实现之一的示例:

private void ReadWriteStream(Stream readStream, Stream writeStream)
{
    int Length = 256;
    Byte[] buffer = new Byte[Length];
    int bytesRead = readStream.Read(buffer, 0, Length);
    // write the required bytes
    while (bytesRead > 0)
    {
        writeStream.Write(buffer, 0, bytesRead);
        bytesRead = readStream.Read(buffer, 0, Length);
    }
    readStream.Close();
    writeStream.Close();
}

问题是:

  • 长度应该是什么缓冲区(我见过256,8 * 1024,32768)?
  • 不同的缓冲区大小如何影响性能,内存使用等?

相关问题:
File IO with Streams - Best Memory Buffer Size - 很好的文件IO答案。但是在内存复制方面呢?


我的情况:
我使用ClosedXML MemotyStream创建了workbook.SaveAs(memoryStream);,并在托管堆中分配了大量内存。我查看了源代码,发现有一个使用8 * 1024缓冲区大小的CopyStream方法。可以改变这个大小以某种方式减少内存使用?
注意: Stream需要几乎1Gb的内存。

1 个答案:

答案 0 :(得分:5)

如果您使用的是.NET 4,则可以更简单:

srcStream.CopyTo(dstStream);

但是如果你想/需要自己实现它,我建议使用较小的缓冲区(256B - 1KB)用于内存流,而中等大小的缓冲区(10KB)用于文件流。您还可以使其依赖于源流的大小,例如10%,大小限制为1MB左右。

对于文件,缓冲区越大,复制操作越快(在某种程度上),但安全性会降低。对于内存流,小缓冲区几乎与大缓冲区一样有效但内存更容易(如果你复制很多)。