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

Ana*_*uza 0 c# optimization buffer stream

我看到了很多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();
}
Run Code Online (Sandbox Code Playgroud)

问题是:

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

相关问题:
带有Streams的文件IO - 最佳内存缓冲区大小 - 很好的文件IO答案.但是在内存复制方面呢?


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

Mac*_*iej 5

如果您使用的是.NET 4,则可以更简单地执行此操作:

srcStream.CopyTo(dstStream);
Run Code Online (Sandbox Code Playgroud)

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

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