例如,我在 Windows 上发送 100000 个 UDP 数据包。对于每个数据包,我需要调用一次 WSASendTo()
,因此可能会引入大量系统调用开销。有没有办法进行批量发送并减少这种开销?谷歌搜索了一段时间后,我找不到适用于 Windows 的解决方案。另外,我想知道这在 Linux 上是否可行。谢谢。
最佳答案
在 Windows 上,您可以在 Server 2012 和 Windows 8 及更高版本上使用新的 Windows 注册 I/O API (RIO)。
我已经写了很多关于它的文章 here并与 Windows 上可用的先前 API 进行了多次性能比较。可以找到性能测试 here .
总结:“注册 I/O 网络扩展,RIO,是一个新的 API,已添加到 Winsock 中以支持高速网络,以提高网络性能并降低延迟和抖动。这些扩展是有针对性的主要用于服务器应用程序,并使用预注册的数据缓冲区和完成队列来提高性能。提高的性能来自于避免在发出单个请求时锁定内存页面和将 OVERLAPPED
结构复制到内核空间的需要,而不是依赖预锁定缓冲区、固定大小的完成队列、可选的完成事件通知以及一次性将多个完成从内核空间返回到用户空间的能力。”
我的性能测试结果似乎暗示它有效。
关于linux - 发送大量UDP数据包时如何减少系统调用开销? (Windows 和 Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20119419/