如何在发送大量UDP数据包时减少系统调用开销? (Windows和Linux)

时间:2013-11-21 11:15:08

标签: linux windows sockets udp

例如,我在Windows上发送100000个UDP数据包。对于每个数据包,我需要调用WSASendTo()一次,因此可能会引入大量的系统调用开销。有没有办法进行批量发送并减少这种开销?谷歌搜索一段时间后,我找不到适合Windows的解决方案。此外,我想知道这是否可以在Linux上。感谢。

2 个答案:

答案 0 :(得分:2)

在Windows上,您可以在Server 2012和Windows 8及更高版本上使用新的Windows注册I / O API(RIO)。

我已经写了很多关于here的文章,并且已经与Windows上提供的以前的API进行了几次性能比较。可以找到性能测试here

总结:“已注册的I / O网络扩展,RIO,是一个新的API,已添加到Winsock以支持高速网络,以提高网络性能,降低延迟和抖动。这些扩展是针对性的主要用于服务器应用程序并使用预先注册的数据缓冲区和完成队列来提高性能。性能的提高来自于在发出单个请求时无需锁定内存页并将OVERLAPPED结构复制到内核空间中,而是依赖于预锁定缓冲区,固定大小的完成队列,完成时的可选事件通知以及一次性从内核空间向用户空间返回多个完成的能力。“

我的表现测试结果似乎暗示它有效。

答案 1 :(得分:0)

在Windows中使用TransmitPackets()