2011-09-28 159 views
2

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

这不仅适用于recv函数,让我们说读一个大的文本文件,我想要一个非常大的缓冲区,或一个较小的缓冲区?

回答

3

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

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

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

0

操作系统已经对它进行了缓冲,所以你不妨在当时只读一个字节。

+4

一个上下文切换不给你任何“最佳表现奖”...... –

0

这取决于您期望的数据类型和您期待的协议。 UDP例如会给你一个全包走那么最佳的缓冲区大小可能是1500

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

0

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

在客户端或服务器已知的协议/加载,只是八九不离十猜测它,(多由其他海报:)

RGDS, 马丁建议

每字节