在 UDP 速度测试中添加哪怕是微小的发送延迟,也会使其速度慢 100 倍

Adding even tiny send delay to a UDP speed test makes it 100x slower

提问人:Archonic 提问时间:12/13/2022 更新时间:12/13/2022 访问量:56

问:

我目前正在尝试比较 TCP 和 UDP 的速度,以用于科学项目。我通过本地网络(目前仅在一台计算机上)发送 10000 个数据包,每个数据包 100 字节,并测量接收 10000 个数据包所需的时间(客户端)。我让我的程序工作,但是,TCP 看起来比 UDP 快得多,这不应该是这个实验的情况(尽管这是一个实验,所以从技术上讲,这些结果可能是有效的......


我通过计算发送的 UDP 数据包数量,然后将它们与接收的数据包数量进行比较来调查该问题。结果证明这是令人震惊的,因为我发现发送了 3000+ 个数据包,但客户端没有收到。为了解决这个问题,我尝试为每个 UDP 数据包发送添加一个短延迟(1 毫秒)(仅限服务器端),但后来发现该延迟(非常令人沮丧)将总传输时间缩短了近 100 倍。然后,我将延迟减少到大约12纳秒,并发现了相同的效果(再次让我懊恼)。我希望这次延迟能给客户一些时间赶上......不要神秘地将我的代码减慢 100 倍!!

谁能帮我?我的代码 https://github.com/Archonic944/ProtocolSpeedTest

Java 套接字 TCP IO UDP

评论

1赞 Stephen C 12/13/2022
Java 中的时钟和计时器受 JVM 可用的计时器的时钟分辨率的限制。这是特定于操作系统的,但在某些平台上,应用程序代码不会比毫秒级分辨率更好......即使他们确实以纳秒为单位指定的时间睡觉。
1赞 Stephen C 12/13/2022
所以。。。当您认为您正在添加 12 纳秒的延迟时,实际情况并非如此。A 仅系统调用就有数百纳秒的开销。然后,您会遇到一个问题,即操作系统线程计划程序无法保证在睡眠计时器到期时立即唤醒线程。(您需要一个 RT 操作系统。最后,您遇到了操作系统的睡眠定时器分辨率问题。如果操作系统只在(比如)1毫秒的“滴答声”上检查睡眠唤醒,那么这就是你所得到的。sleep
0赞 Stephen C 12/13/2022
你没有提到你正在使用什么版本的 Java,或者你正在使用什么版本的操作系统。
0赞 Steffen Ullrich 12/13/2022
“TCP 看起来比 UDP 快得多,这不应该是这个实验的情况”——如果你的期望是 UDP 应该比 TCP 快,那么你的期望是错误的。TCP 针对带宽使用进行了优化。您的“每个 100 字节的数据包”将是一个带有 UDP 的数据包,但这 100 个字节中约有 14..15 个将与 TCP 合并到一个数据包中,这意味着开销要少得多。
0赞 Archonic 12/14/2022
这是有道理的,但它仍然不能解释我在通过 UDP 发送时遇到的 3000 个数据包的丢弃。另外,我正在运行 macOS Ventura,我的 Java 版本是 1.8.0。

答: 暂无答案