要从python中的套接字读取数据,请调用socket.recv,它具有以下签名:
socket.recv(bufsize[, flags])
socket.recv的python文档模糊地陈述:
注意:为了最好地匹配硬件和网络现实,bufsize的值应该是2的相对较小的幂,例如4096.
问题:" 最符合硬件和网络现实 "是什么意思?将bufsize设置为非二次幂的实际影响是什么?
我已经看到许多 其他的 建议,使这个读取2的幂.我也很清楚,当数组长度为2的幂时通常有用的原因(长度上的位移/屏蔽操作,最佳FFT数组大小等),但这些是依赖于应用程序的.我只是没有看到它的一般原因socket.recv.当然不是python文档中具体建议的要点.我也没有看到底层python代码中的任何二次幂优化,使其成为特定于python的推荐
例如......如果您有一个协议,其中传入的数据包长度是完全已知的,那么显然最好只读取"最多"您正在处理的数据包所需的内容,否则您可能会吃掉下一个数据包那会很烦人.如果我正在处理的数据包只有42个字节待处理,我只会将bufsize设置为42.
我错过了什么?当我必须选择任意缓冲区/数组大小时,我通常(总是?)使长度为2的幂,以防万一.这只是多年来养成的习惯.python文档也只是习惯的受害者吗?
这不是python独有的,但由于我特意引用了python文档,我会将其标记为.
更新:我刚刚在我的系统上检查了内核级缓冲区的大小(或者至少我认为我做了......我做了cat /proc/sys/net/core/rmem_default)并且它是124928.不是2的强大. rmem_max是131071,也显然不是两个人的力量.
在研究这个问题时,我真的看不出两项建议的力量有什么好处.我准备将其称为虚假推荐......
我还添加tcp和C标签,因为他们也与此有关.