Python TCP套接字recv(1)与recv(n)的效率

时间:2013-07-06 09:14:20

标签: python sockets tcp

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

一次是recv一个字符的最佳(即最有效/最快)方法,并检查它是换行符还是recv更大的缓冲区并在类中存储“剩余”? / p>

一次一个

def __recv_until_newline(self):
    message = ""
    while True:
        chunk = self.socket.recv(1)
        if chunk == "" or chunk == "\n":
            break
        message += chunk
    return message

维护缓冲区

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]

1 个答案:

答案 0 :(得分:1)

获得大块块肯定更有效率,因为你的操作更少。想想这样:如果你有一条长度为1000的消息,那么你的循环将在第一种情况下发射1000次而在第二种情况下仅发射16次。性能损失是显而易见的。当然这是因为Python,但即使在操作系统级别它也更有效率,因为同样的原因:制作1000个sys调用instad 16和扫描字符串(顺便说一下:你应该扫描chunk而不是{长度为64的{1}}比对message的64次调用便宜。这就是它。