C# 从网络流中读取。我应该使用什么bytesize?

C# 从网络流中读取。我应该使用什么bytesize?,c#,byte,networkstream,C#,Byte,Networkstream,我试图弄清楚在从网络流读取时,我应该将字节大小设置为多少。使用较小或较大的数字有什么优点和缺点 我看到的许多例子都使用256。为什么? int byteSize = 256; TcpListener server = new TcpListener(IPAddress.Any, 9999); server.Start(); Byte[] bytes = new Byte[byteSize]; TcpClient client = server.AcceptTcpClient(); Netw

我试图弄清楚在从网络流读取时,我应该将字节大小设置为多少。使用较小或较大的数字有什么优点和缺点

我看到的许多例子都使用256。为什么?

int byteSize = 256;

TcpListener server = new TcpListener(IPAddress.Any, 9999);
server.Start();
Byte[] bytes = new Byte[byteSize];

TcpClient client = server.AcceptTcpClient();

NetworkStream stream = client.GetStream();
int i = 0;

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
    // Do stuff with the stream
}

根据代码
i
设置的任何值都是从套接字读取的实际字节,因此如果
i
byteSize
小得多,则
byteSize
对您没有帮助

while
中,您应该检查
i
是否小于
byteSize
,如果是,请将
byte
(字节数组)的第一个
i
字节复制到一个安全的地方,即内存流或文件流,并继续读取套接字以到达网络流的末尾(其中i=0)。1024、2048和4096看起来不错,这取决于您的网络速度、可用内存和使用这种缓冲区的线程。例如,使用1024个缓冲区大小的100个线程会消耗100KB的RAM,这在今天的硬件规模上是微不足道的


就我个人而言,大多数情况下使用智能缓冲区,我的意思是在运行时,我会根据缓冲区大小检查读取量,并对其进行更正以获得更好的结果(尽管根据项目,这是值得的)。

将其设置得太小,您将因.NET不得不更频繁地调用操作系统以重新填充缓冲区而失去一些效率。把它做得太大会浪费一些内存


这并不是很关键,但256处于低端。非常常见的I/O缓冲区大小是4096字节。在Windows中,它是一个神奇的数字,大小相当于一个内存页。尽管缓冲区刚好跨一页只是偶然的。

我现在偶然发现了这一点,以防其他人也这么做,这就是我设置字节大小的方法


因此,为了简化:性能越低=性能越差,内存使用率越高?是的。我不能发布这样的简短回答,它们会转换成评论。你到底是如何实现智能缓冲区的?您是否只是假设上一次读取并将其设置为缓冲区大小,以假设下一次读取的量相似?@CathalMF:我从2048开始,例如
I
等于它,然后将其设置为
4096
,然后再次对照
I
进行检查,直到
I
略小于我的缓冲区。此外,如果差异变大,如果内存重要,我将使缓冲区变小。如果有很多线程,我会使用循环缓冲区来防止内存碎片(在重载机器上这是一种罕见的情况)。名称
bytesSize
bufferSize
会更清晰。
int byteSize = new byte[tcpClient.ReceiveBufferSize];

Byte[] bytes = new Byte[byteSize];