【发布时间】:2021-06-07 16:00:58
【问题描述】:
我正在将数据从客户端发送到服务器。我想准确计算数据到达目的地所需的时间。客户端和服务器在不同的PC上,所以我认为使用系统时间是不明智的,因为它们在不同的系统上。
请告知测量数据到达目的地所用时间的最准确方法。
【问题讨论】:
-
为什么不使用客户端和服务器系统时间?你想要亚秒级的精度吗?
标签: c++ performance http websocket latency
我正在将数据从客户端发送到服务器。我想准确计算数据到达目的地所需的时间。客户端和服务器在不同的PC上,所以我认为使用系统时间是不明智的,因为它们在不同的系统上。
请告知测量数据到达目的地所用时间的最准确方法。
【问题讨论】:
标签: c++ performance http websocket latency
close 将阻塞直到所有数据都发送完毕,因此如果您从write 开始时间,并在close 之后结束,您将拥有发送时间。对于UDP,数据已经传输,对于TCP,它已经被确认。如果你发送到火星车,那么时间会是往返,但通常确认时间很短。
start_time = someTimeFunc();
char *foo = buf;
while (size) {
ssize_t sent = send(sock,foo,size,flags);
if (sent <= 0)
fail;
foo += sent;
size -= sent;
}
close(sock);
end_time = someTimeFunc();
【讨论】:
当应用“发送”数据时,实际上并没有立即传输数据。它被放入操作系统内核中的队列中,然后将控制权返回给应用程序。内核将在自己的时间在后台传输排队的数据。无法知道内核何时实际传输,或者数据到达目的地需要多长时间。即使这样,数据也会被放入接收端的另一个内核队列中,等待接收应用程序从该队列中提取数据。
因此,按照您的要求进行操作的唯一方法是让接收方显式向发送方发送确认,指定何时接收方实际读取数据。发送方和接收方必须就时间尺度达成一致,例如 UTC,并且还必须将它们的时钟同步到一个公共源。然而,这并不是 transmission 时间的真实反映,但如果发送方和接收方都及时处理各自的套接字 I/O,它可能会 close方式。
【讨论】: