由于 TCP 拥塞控制的工作方式,一次性发送所有数据会更加高效。TCP 维护一个允许“空中”传输(已发送但尚未确认)数据量的窗口。TCP 测量返回的确认,以计算出在不造成拥塞(即数据包丢失)的情况下“空中”可以拥有多少数据。如果应用程序没有足够的数据来填充窗口,TCP 就无法进行准确的测量,因此它将保守地缩小窗口。
如果您只有几个小标头,并且您的调用send是快速连续的,则操作系统通常会为您缓冲数据并将其全部发送到一个数据包中。在这种情况下,TCP 拥塞控制并不是真正的问题。然而,每次调用都send涉及从用户模式到内核模式的上下文切换,这会产生 CPU 开销。换句话说,您最好在应用程序中进行缓冲。
(至少)在一种情况下,不使用缓冲会更好:当缓冲速度慢于上下文切换开销时。如果您用 Python 编写一个复杂的缓冲区,情况很可能就是这样。用 CPython 编写的缓冲区将比内核中精细优化的缓冲区慢很多。缓冲所付出的代价很可能超过它所带来的好处。
如有疑问,请进行测量。
但需要注意的是:过早的优化是万恶之源。这里的效率差异非常小。如果您尚未确定这是您的应用程序的瓶颈,请选择让您的生活更轻松的方式。您以后可以随时更改它。
| 归档时间: |
|
| 查看次数: |
686 次 |
| 最近记录: |