gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:52:21 28 4
gpt4 key购买 nike

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

是一次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]

最佳答案

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

关于python - Python TCP 套接字 recv(1) 与 recv(n) 的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17501488/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com