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