6

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

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

为了澄清,简单地说,我的意思是

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

性能是这个应用程序的关键boost::signals2,所以应用程序不需要的所有奇迹可能弊大于利。

现在,只需std::vector<std::function>处理这个问题,然后切换到其他东西,boost::signals2如果它被认为合适的话会非常简单。

4

2 回答 2

17

我最近在一个具有类似简单要求的项目中遇到了同样的问题,并做了一些我想在这里分享的研究。

我的主要兴趣在于boost::signals2与简单的回调函数向量实现相比的开销。最后我做了一些更多的研究,如下表所示:

    基准持续时间(标准化)
    -------------------------------------------------- ------------------
    直接函数调用 1
    函数指针调用 1
    虚函数调用 1
    std::函数调用 1.5
    std::vector<std::function> 调用 2
    boost::signals 信号调用 78
    boost::signals2 信号调用(虚拟互斥体)43
    boost::signals2 信号调用 92

测量是在具有 gcc 4.9.2、优化 -O2、Boost v1.55 的 Ubuntu 15.04 上进行的。因为绝对值在我的盒子之外可能毫无意义,所以这些值是标准化的。更新版本的 Boost 可能会更快。

我的结论是:如果性能至关重要并且您不需要线程安全(或其他高级功能),请重新考虑使用boost::signals2.

如果您想在您的机器上重现这些措施,可以在此处获得代码。

于 2016-06-14T08:57:17.440 回答
3

总结一下评论中的对话:

看来这个问题已经归结为,停止理论化,开始基准测试

最后,我发现它的一些附加功能boost::signals2非常有益(例如.track在插槽上)并且值得任何性能成本(如果有的话)。

于 2014-03-19T23:42:48.743 回答