【问题标题】:Boost asio async vs blocking reads, udp speed/quality提升 asio 异步与阻塞读取、udp 速度/质量
【发布时间】:2009-07-27 14:47:43
【问题描述】:
我有一个用 C# 编写的快速而肮脏的概念证明应用程序,它从网络读取高数据速率多播 UDP 数据包。由于各种原因,完整的实现将用 C++ 编写,我正在考虑使用 boost asio。 C# 版本使用线程通过阻塞读取来接收数据。如果计算机负载很重(通常在另一个线程中处理这些数据包),我会遇到一些丢弃数据包的问题。
我想知道的是,boost 中的async read 操作(在 Windows 中使用重叠 io)是否有助于确保我接收数据包和/或减少接收数据包所需的 CPU 时间。执行阻塞读取的单线程非常简单,使用异步读取似乎更复杂,但我认为如果它提供更高的性能或在重负载系统上丢弃更少的数据包,那将是值得的。目前数据速率应不高于 60Mb/s。
【问题讨论】:
标签:
asynchronous
udp
boost-asio
overlapped-io
【解决方案1】:
我还使用boost::asio 编写了一些多播处理代码。我想说的是,总的来说,根据我的经验,在 asio 中做事会增加很多复杂性,这可能会让与你一起工作的其他人不容易理解你最终编写的代码。
也就是说,支持迁移到asio 而不是使用许多不同的线程来完成工作的论据大概是您必须减少上下文切换。这在单核机器上显然是正确的,但是当你使用多核时呢?您是打算将收到的工作卸载到线程还是只让一个线程完成处理工作?如果您采用单线程方法,您最终会遇到这样的情况:您可能会丢弃等待该线程处理工作的数据包。
最后是秋千和环形交叉路口。如果你打算这样做的话,我想说你想得到一些相当可靠的数据来支持你走这条路的论点,只是因为它所带来的所有额外的复杂性(我敢肯定,对于某些人来说,这是一个全新的范式)。