对于简单的应用程序,boost :: signals2是否过度杀伤?

时间:2014-03-14 22:25:22

标签: c++ c++11 boost signals-slots boost-signals2

在仅限C++03的环境中,boost::signals2boost::functionboost::bind一起用于在组件之间实现简单的消息传递系统。它工作得很好,我也没有任何问题。

但是,在完全支持C++11的另一个环境中,boost::signals2对于非常简单的应用程序来说是否过度?

为了澄清,简单地表示以下

  • 单线程
  • 所有信号都有返回类型void

性能是此应用程序的关键,因此应用程序不需要boost::signals2的所有奇迹可能弊大于利。< / p>

目前,只需std::vector<std::function>处理此问题,如果认为合适,则切换到boost::signals2等其他内容会非常简单。

2 个答案:

答案 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)并且值得任何性能成本(如果有的话)。