boost 协程是否比来自 Boost.Asio 的异步操作更快?或者在什么情况下协程可以更快?
Are boost coroutines faster than async operations from Boost.Asio? Or in what cases coroutines can be faster?
在我的例子中,我有一个服务器可以处理大量的 sip 调用(同时处理 3000 个)。它发送和接收 SIP 数据包和大量 RTP 数据包(每 20 毫秒一个数据包)。
现在一切都通过 Boost.Asio.
与回调异步工作
我现在正面临优化问题。已经做了一些事情来让它工作得更快(例如,从动态分配到池分配的过渡,改变了获取时间的方法等),但加速是适度的。
Function profiler 在顶部显示了大量 mutex_locks,所以我认为它与所有这些异步调用有关。通过浏览网络,我发现协程可以替代回调。
据我了解,它们使代码看起来更吸引人和更简单,同时仍保持异步性质。
但是它的性能呢?协同程序会比异步调用和回调更快吗(至少在我的情况下)?
这是探查器的屏幕截图:
Profiler output
协程并不比异步调用快,因为它们对于 Asio 来说是一样的。
主要区别在于您编写组合操作的方式:使用 coros 时,您将隐式 coro 堆栈作为 "closure",否则您必须使用 类 来执行相同的操作。 (取决于你如何你做了后者,协程可能如果他们更有效地完成工作,最终会更快。None是你描述的瓶颈)
在我的例子中,我有一个服务器可以处理大量的 sip 调用(同时处理 3000 个)。它发送和接收 SIP 数据包和大量 RTP 数据包(每 20 毫秒一个数据包)。
现在一切都通过 Boost.Asio.
与回调异步工作我现在正面临优化问题。已经做了一些事情来让它工作得更快(例如,从动态分配到池分配的过渡,改变了获取时间的方法等),但加速是适度的。
Function profiler 在顶部显示了大量 mutex_locks,所以我认为它与所有这些异步调用有关。通过浏览网络,我发现协程可以替代回调。 据我了解,它们使代码看起来更吸引人和更简单,同时仍保持异步性质。
但是它的性能呢?协同程序会比异步调用和回调更快吗(至少在我的情况下)?
这是探查器的屏幕截图: Profiler output
协程并不比异步调用快,因为它们对于 Asio 来说是一样的。
主要区别在于您编写组合操作的方式:使用 coros 时,您将隐式 coro 堆栈作为 "closure",否则您必须使用 类 来执行相同的操作。 (取决于你如何你做了后者,协程可能如果他们更有效地完成工作,最终会更快。None是你描述的瓶颈)