Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么更快:多个'send'或使用缓冲?_Python_C_Sockets_Buffer_Send - Fatal编程技术网

Python 什么更快:多个'send'或使用缓冲?

Python 什么更快:多个'send'或使用缓冲?,python,c,sockets,buffer,send,Python,C,Sockets,Buffer,Send,我正在玩C/Python中的套接字,我想知道从Python字典向客户端套接字发送头的最有效方法是什么 我的想法是: 对每个标题使用send调用优点:无需内存分配缺点:许多发送呼叫——可能容易出错;错误管理应该相当复杂 使用缓冲区优点:一个发送呼叫,错误检查更容易Cons:需要缓冲区:-)malloc/realloc应该相当慢,并且使用(太)大的缓冲区来避免调用realloc会浪费内存 有给我的建议吗?谢谢:-)除非您发送的数据量确实很大,否则最好使用一个缓冲区。如果使用几何级数来增加缓冲区大小,

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

我的想法是:

  • 对每个标题使用
    send
    调用优点:无需内存分配缺点:许多
    发送
    呼叫——可能容易出错;错误管理应该相当复杂
  • 使用缓冲区优点:一个
    发送
    呼叫,错误检查更容易Cons:需要缓冲区:-)
    malloc
    /
    realloc
    应该相当慢,并且使用(太)大的缓冲区来避免调用
    realloc
    会浪费内存

  • 有给我的建议吗?谢谢:-)

    除非您发送的数据量确实很大,否则最好使用一个缓冲区。如果使用几何级数来增加缓冲区大小,分配的数量将成为一个摊销常数,分配缓冲区的时间通常也会随之增加。

    a
    send()
    调用意味着要往返内核(操作系统中直接处理硬件的部分)。它的单位成本约为几百个时钟周期。这是无害的,除非您尝试调用
    send()
    数百万次

    通常,缓冲是指在收集到“足够的数据”时,仅偶尔调用
    send()
    。“足够”并不意味着“整个消息”,而是“足够的字节,使内核往返的单位成本相形见绌”。根据经验,8-kB缓冲区(8192字节)通常被认为是好的


    不管怎么说,对于所有与绩效相关的问题,没有什么比实际测量更好的了。试试看。大多数情况下,没有任何值得担心的实际性能问题。

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

    如果您只有几个小标题,并且对
    send
    的调用是快速连续的,那么操作系统通常会为您缓冲数据,并在一个数据包中发送所有数据。在这种情况下,TCP拥塞控制并不是一个真正的问题。但是,对
    send
    的每次调用都涉及从用户模式到内核模式的上下文切换,这会导致CPU开销。换句话说,在应用程序中使用缓冲还是更好的

    有(至少)一种情况下,不使用缓冲会更好:当缓冲比上下文切换开销慢时。如果用Python编写复杂的缓冲区,很可能就是这样。用CPython编写的缓冲区将比内核中经过优化的缓冲区慢很多。很有可能缓冲会让你付出比买来的更多的代价

    如有疑问,请测量


    但有一句话需要提醒:过早优化是万恶之源。这里的效率差别很小。如果您还没有确定这是您的应用程序的一个瓶颈,那么请选择使您的生活更轻松的方法。您随时可以稍后更改。

    还请注意,根据您的平台和网络配置,发送大量小数据包有时会导致数据包定时问题,从而降低性能。您建议采用哪种几何级数?在这种情况下,这只意味着当缓冲区满了,您需要扩展它时,将其大小乘以某个因子,而不仅仅是添加某个固定的数量。系数1.5似乎工作得很好。