gpt4 book ai didi

python - TCP 与 UDP 套接字延迟基准

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

我已经在 Python 中通过 TCP 和 UDP 实现了套接字通信的小型基准测试。令人惊讶的是,TCP 的速度几乎是 UDP 的两倍。

为了避免路由影响,服务器和客户端运行在同一台 Unix 机器上,但在不同的线程上。

也许代码有用。这是服务器代码:

import socket
import sys

host = 'localhost'
port = 8888
buffersize = 8
server_address = (host, port)

def start_UDP_server():
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_UDP.bind(server_address)

print("UDP server is running...")

while True:
data, from_address = socket_UDP.recvfrom(buffersize)
if not data: break
socket_UDP.sendto(data, from_address)
socket_UDP.close()


def start_TCP_server():
socket_TCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_TCP.bind(server_address)
socket_TCP.listen(1)

print("TCP server is running...")

while True:
client, client_address = socket_TCP.accept()

while True:
data = client.recv(buffersize)
if not data: break
client.sendall(data)

client.close()

因此您可以运行 start_TCP_server()start_UDP_server()

在客户端的代码是:

import socket
import sys
import time

host = 'localhost'
port = 8888
buffersize = 8
server_address = (host, port)
client_address = (host, port+1)
N = 1000000


def benchmark_UDP():
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_UDP.bind(client_address)

print("Benchmark UDP...")

duration = 0.0
for i in range(0, N):
b = bytes("a"*buffersize, "utf-8")
start = time.time()
socket_UDP.sendto(b, server_address)
data, from_address = socket_UDP.recvfrom(buffersize)
duration += time.time() - start

if data != b:
print("Error: Sent and received data are bot the same")

print(duration*pow(10, 6)/N, "µs for UDP")


def benchmark_TCP():
socket_TCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_TCP.connect(server_address)

print("Benchmark TCP...")

duration = 0.0
for i in range(0, N):
b = bytes("a"*buffersize, "utf-8")
start = time.time()
socket_TCP.sendall(b)
data = socket_TCP.recv(buffersize)
duration += time.time() - start

if data != b:
print("Error: Sent and received data are bot the same")

print(duration*pow(10, 6)/N, "µs for TCP")
socket_TCP.close()

与服务器一样,您可以通过 benchmark_TCP()benchmark_UDP() 启动基准测试。

在 Unix 上,TCP 的结果约为 25 µs,UDP 的结果约为 54 µs,Windows 的结果更差(TCP 约为 30 µs,超过 200 µs用于 UDP)。为什么?我希望 UDP 的优势很小。

最佳答案

您的 TCP 套接字已连接,但 UDP 套接字未连接。这意味着对 UDP 套接字上的每个发送/接收进行额外处理。在 each side 上调用 connect对于 UDP 套接字,就像您在 TCP 套接字上调用 connect/accept 一样。

iperf 等程序会执行此操作以准确测量。

关于python - TCP 与 UDP 套接字延迟基准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32654551/

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