在 Windows 中,可以说我正在使用该recv
函数从套接字接收数据。我很好奇最佳缓冲区有多大?我可以把它做成字节,1024
或者我可以把它做成51200
字节,或者更大。我想知道哪个对性能更好。
这不仅适用于recv
函数,比如说我正在读取一个大文本文件,我想要一个非常大的缓冲区还是一个更小的缓冲区?
操作系统执行自己的缓冲,因此缓冲区的大小并不重要。性能损失在于函数调用:1 字节缓冲区效率低下,因为它需要对recv()
. 缓冲区太大只是浪费空间。
最佳大小将是您希望在单个recv()
调用中接收或能够处理的数据大小的两倍,下限约为 1 或 2 个 tcp 帧。
我个人使用 4KB 缓冲区,但这是我自己的偏好,这在很大程度上取决于我正在编写的应用程序。
这取决于您期望的数据类型和您期望的协议。例如,UDP 会一次性给你一个完整的数据包,因此最佳缓冲区大小可能是 1500。
真正的性能障碍将是您将进行的函数调用(recv
在这种情况下)。为了提高性能,您可以从默认的大值开始,然后分析接收到的数据包大小。根据分析,您可以传递(几乎)“理想”缓冲区大小。
如果您有一个服务器类型的情况,您不知道要在其上运行哪些服务,您可以使用一系列不同大小的缓冲池,例如 [128,1024,4096,16384,65536]。当有东西连接时,使用 128 大小,如果所有 128 都进来,下次使用 1024.. 等等。
在具有已知协议/负载的客户端或服务器上,只需猜测一下,(就像其他海报所建议的那样:)
Rgds,马丁
操作系统已经对其进行缓冲,因此您不妨一次读取一个字节。