我正在试图弄清楚从NetworkStream读取时我应该将byteSize设置为什么大小。什么是使用更小或更大数字的利弊?
我见过的很多例子都使用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
}
答案 0 :(得分:3)
使它太小,你将失去一些效率,因为.NET必须更频繁地调用操作系统来重新填充缓冲区。让它太大,你浪费一些记忆。
这不是那么重要,但256是低端。一个非常常见的I / O缓冲区大小是4096字节。它是Windows中的神奇数字,是内存页面的大小。虽然缓冲区只会偶然跨越一页。
答案 1 :(得分:0)
根据您的代码i
设置的是从套接字读取的实际字节数,因此如果byteSize
远小于{{1},则i
无法帮助您}}
在byteSize
内,您应该检查while
是否小于i
,如果是,请复制byteSize
的第一个i
个字节(字节数组) )到安全的地方,即内存流或文件流,并继续读取套接字以到达网络流的末尾(其中i = 0)。 1024,2048和4096似乎很好,具体取决于您的网络速度,可用内存和使用此类缓冲区的线程。例如,使用100个1024缓冲区大小的线程,你需要100 KB的RAM,这在今天的硬件规模上是没有的。
个人大部分时间都使用智能缓冲区,我的意思是在运行时我会根据缓冲区大小检查读取量并更正它以获得更好的结果(尽管根据项目是否值得)。
答案 2 :(得分:0)
我现在偶然发现这一点,以防万一其他人可以这样做,这就是我将如何设置字节大小https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.getstream?view=netframework-4.7.2
int byteSize = new byte[tcpClient.ReceiveBufferSize];
Byte[] bytes = new Byte[byteSize];