首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python套接字recv(1) vs recv(n)的效率

Python套接字recv(1) vs recv(n)的效率
EN

Stack Overflow用户
提问于 2013-07-06 09:14:20
回答 1查看 2.7K关注 0票数 0

我正在构建一个TCP应用程序,它使用换行符( \n )分隔长度未知的消息(但通常是<64个字节)。我发现这篇文章非常有用。

最好的(即最有效/最快的)方法一次只使用一个字符并检查它是换行符还是recv是一个更大的缓冲区并将“剩菜”存储在类中?

一次一个

代码语言:javascript
复制
def __recv_until_newline(self):
    message = ""
    while True:
        chunk = self.socket.recv(1)
        if chunk == "" or chunk == "\n":
            break
        message += chunk
    return message

维护缓冲区

代码语言:javascript
复制
def __recv_until_newline(self):
    """ self.__buffer holds previously received message parts"""
    message = self.__buffer
    while True:
        chunk = self.socket.recv(64)
        message += chunk
        if chunk == "" or "\n" in message:
            break

    # something a bit more intelligent than this in reality, but you get the idea
    messages = message.split('\n')
    self.__buffer = "".join([x for x in message[1:]])
    return messages[0]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-06 09:46:01

获得大块绝对是更有效的,因为你做的操作更少。可以这样想:如果您有一条长度为1000的消息,那么您的循环将在第一次触发1000次,而在第二次只有16次。性能损失是很明显的。当然,这是因为Python,但是即使在操作系统级别上,由于同样的原因,它也更高效:使1000个sys调用安装16。并且扫描长度为64的字符串(顺便说一句:您应该扫描chunk而不是message)比对recv的64个调用要便宜得多。差不多就是这样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17501488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档