在仅限C++03
的环境中,boost::signals2
与boost::function
和boost::bind
一起用于在组件之间实现简单的消息传递系统。它工作得很好,我也没有任何问题。
但是,在完全支持C++11
的另一个环境中,boost::signals2
对于非常简单的应用程序来说是否过度?
为了澄清,简单地表示以下:
void
性能是此应用程序的关键,因此应用程序不需要的boost::signals2
的所有奇迹可能弊大于利。< / p>
目前,只需std::vector<std::function>
处理此问题,如果认为合适,则切换到boost::signals2
等其他内容会非常简单。
答案 0 :(得分:11)
我最近遇到了一个具有类似简单要求的项目的相同问题,并做了一些我想在这里分享的研究。
与简单的回调函数实现相比,我的主要兴趣在于boost::signals2
的开销。最后,我做了一些研究,如下表所示:
Benchmark Duration (normalized) --------------------------------------------------------------------- Direct function call 1 Function pointer call 1 Virtual function call 1 std::function call 1.5 std::vector<std::function> call 2 boost::signals signal invocation 78 boost::signals2 signal invocation (dummy mutex) 43 boost::signals2 signal invocation 92
测量是在Ubuntu 15.04上进行的,gcc 4.9.2,优化-O2,Boost v1.55。因为绝对值可能在我的框外无意义,所以值被标准化。更新版本的Boost可能会更快。
我的结论是:如果性能至关重要且您不需要线程安全(或其他高级功能)重新考虑使用boost::signals2
。
如果您想在机器上重现这些措施,则代码可用here。
答案 1 :(得分:2)
在评论中总结对话:
似乎这个问题已经归结为,停止理论化,开始基准测试
最后,我发现boost::signals2
的一些附加功能非常有用(例如插槽上的.track
)并且值得任何性能成本(如果有的话)。