什么是更快:多个`发送或使用缓冲?

Jon*_* H. 5 c python sockets buffer send

我正在使用C/Python中的套接字,我想知道从Python字典向客户端套接字发送标头的最有效方法是什么.

我的想法:

  1. send对每个标题使用一个调用.优点:无需内存分配.缺点:很多send电话 - 可能容易出错; 错误管理应该相当复杂
  2. 使用缓冲区.优点:一次 send通话,错误检查更容易.缺点:需要一个缓冲区:-) malloc/ realloc应该相当慢并使用(太)大缓冲区来避免realloc调用浪费内存.

有什么提示吗?谢谢 :-)

Dan*_*ach 3

由于 TCP 拥塞控制的工作方式,一次性发送所有数据会更加高效。TCP 维护一个允许“空中”传输(已发送但尚未确认)数据量的窗口。TCP 测量返回的确认,以计算出在不造成拥塞(即数据包丢失)的情况下“空中”可以拥有多少数据。如果应用程序没有足够的数据来填充窗口,TCP 就无法进行准确的测量,因此它将保守地缩小窗口。

如果您只有几个小标头,并且您的调用send是快速连续的,则操作系统通常会为您缓冲数据并将其全部发送到一个数据包中。在这种情况下,TCP 拥塞控制并不是真正的问题。然而,每次调用都send涉及从用户模式到内核模式的上下文切换,这会产生 CPU 开销。换句话说,您最好在应用程序中进行缓冲。

(至少)在一种情况下,不使用缓冲会更好:当缓冲速度慢于上下文切换开销时。如果您用 Python 编写一个复杂的缓冲区,情况很可能就是这样。用 CPython 编写的缓冲区将比内核中精细优化的缓冲区慢很多。缓冲所付出的代价很可能超过它所带来的好处。

如有疑问,请进行测量。

但需要注意的是:过早的优化是万恶之源。这里的效率差异非常小。如果您尚未确定这是您的应用程序的瓶颈,请选择让您的生活更轻松的方式。您以后可以随时更改它。