1

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

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

一次一个

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]
4

1 回答 1

1

获得大块肯定更有效,因为您执行的操作更少。可以这样想:如果您有一条长度为 1000 的消息,那么您的循环将在第一种情况下触发 1000 次,而在第二种情况下仅触发 16 次。性能损失是显而易见的。当然这是因为 Python,但即使在操作系统级别上,由于相同的原因,它也更有效:使 1000 sys 调用而不是 16。并且扫描长度为 64 的字符串(顺便说一句:你应该扫描chunk而不是)更少message昂贵的然后 64 电话recv。差不多就是这样。

于 2013-07-06T09:46:01.053 回答