2

在 Windows 中,可以说我正在使用该recv函数从套接字接收数据。我很好奇最佳缓冲区有多大?我可以把它做成字节,1024或者我可以把它做成51200字节,或者更大。我想知道哪个对性能更好。

这不仅适用于recv函数,比如说我正在读取一个大文本文件,我想要一个非常大的缓冲区还是一个更小的缓冲区?

4

4 回答 4

3

操作系统执行自己的缓冲,因此缓冲区的大小并不重要。性能损失在于函数调用:1 字节缓冲区效率低下,因为它需要对recv(). 缓冲区太大只是浪费空间。

最佳大小将是您希望在单个recv()调用中接收或能够处理的数据大小的两倍,下限约为 1 或 2 个 tcp 帧。

我个人使用 4KB 缓冲区,但这是我自己的偏好,这在很大程度上取决于我正在编写的应用程序。

于 2011-09-28T13:52:52.593 回答
0

这取决于您期望的数据类型和您期望的协议。例如,UDP 会一次性给你一个完整的数据包,因此最佳缓冲区大小可能是 1500。

真正的性能障碍将是您将进行的函数调用(recv在这种情况下)。为了提高性能,您可以从默认的大值开始,然后分析接收到的数据包大小。根据分析,您可以传递(几乎)“理想”缓冲区大小。

于 2011-09-28T15:03:21.857 回答
0

如果您有一个服务器类型的情况,您不知道要在其上运行哪些服务,您可以使用一系列不同大小的缓冲池,例如 [128,1024,4096,16384,65536]。当有东西连接时,使用 128 大小,如果所有 128 都进来,下次使用 1024.. 等等。

在具有已知协议/负载的客户端或服务器上,只需猜测一下,(就像其他海报所建议的那样:)

Rgds,马丁

于 2011-09-28T16:09:35.550 回答
0

操作系统已经对其进行缓冲,因此您不妨一次读取一个字节。

于 2011-09-28T13:41:33.093 回答