0

读取本地文件并通过网络(本地和互联网)发送它时,是否有任何建议或推荐的缓冲区大小?我们使用 4k,因为它是 Windows VM 页面大小,但由于这可能是延迟、带宽、抖动等的复杂函数,我想了解在大多数情况下可以做得很好的实现。我们希望有一个更简单的解决方案来最小化代码更改行(代码审计)。

using (var destFs = new NetworkStream(URI, FileMode.OpenOrCreate))
{
    var buffer = new byte[4*1024]; // <= better buffer size?
    int bytesRead;
    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
    {
        destFs.Write(buffer, 0, bytesRead);
    }
}
4

2 回答 2

0

您应该将其设为 2 的幂,并且您还应该将其设为 4096 的倍数,原因是您给出的原因是它是一个常见的磁盘簇大小。我个人在任何地方都使用 8192,但如果您对吞吐量感兴趣,您可能会发现使用 32k、128k 等尺寸会更好:实验将显示好处开始变得微不足道的地方。

于 2013-03-13T04:31:54.273 回答
0

这取决于 !

如果您使用的是 TCP(您可能对此感兴趣)

TCP 数据包大小的绝对限制是 64K(65535 字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低层(例如以太网)的数据包大小较小。

例如,以太网的 MTU(最大传输单元)为 1500 字节。某些类型的网络(如令牌环)具有较大的 MTU,而某些类型具有较小的 MTU,但对于每种物理技术,这些值是固定的。

如果您使用的是 UDP

正确的最大 UDP 消息大小为 65507,由以下公式确定:0xffff - (sizeof(IP Header) + sizeof(UDP Header)) = 65535-(20+8) = 65507

于 2013-03-13T01:00:43.947 回答