2

我试图弄清楚从 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
}
4

3 回答 3

3

让它太小,你会失去一些效率,因为 .NET 不得不更频繁地调用操作系统来重新填充缓冲区。让它太大,你会浪费一些内存。

它不是那么重要,但 256 处于低端。一个非常常见的 I/O 缓冲区大小是 4096 字节。它是 Windows 中的一个幻数,即内存页的大小。尽管缓冲区只是偶然地恰好跨越一页。

于 2013-05-10T22:46:23.873 回答
0

无论您根据代码设置什么,i都是从套接字读取的实际字节,因此byteSize如果aibyteSize.

在你的内部while你应该检查是否i更小,如果是这样,将你的(字节数组)byteSize的第一个字节复制到一个安全的地方,即内存流或文件流并继续读取套接字以到达网络流的末尾(其中我 = 0)。1024、2048 和 4096 看起来不错,具体取决于您的网络速度、可用内存和使用此类缓冲区的线程。例如,使用 100 个线程和 1024 缓冲区大小会花费 100 KB 的 RAM,这在当今的硬件规模上不算什么。ibyte

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

于 2013-05-10T22:42:50.747 回答
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];
于 2019-01-18T12:40:00.140 回答