【问题标题】:Is boost::signals2 overkill for simple applications?boost::signals2 对于简单的应用程序是否过度杀伤?
【发布时间】:2014-03-14 22:25:22
【问题描述】:

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

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

为了澄清,我的意思很简单

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

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

现在,只有一个 std::vector<std::function> 来处理这个问题,如果认为合适的话,切换到诸如 boost::signals2 之类的东西会非常简单。

【问题讨论】:

  • 那么您的分析器从Boost.Signals2 告诉您有关 CPU/内存使用量的信息是什么?它甚至是瓶颈吗?
  • 如果性能是关键,我通常会发现自己实现可订阅事件或可观察对象。这总是与处理不同的层。
  • 正如 Andrei Alexandrescu 所说...The only good intuition: "I should time this." C++ 的三个优化技巧slideshare.net/andreialexandrescu1/…
  • 看来这个问题已经归结为,停止理论,开始基准测试。感谢您的帮助。
  • @IgorR。谢谢,在阅读了这些内容和其他一些内容之后,我最终选择了 boost::signals2 :)

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


【解决方案1】:

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

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

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

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

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

如果你想在你的机器上重现这些措施,代码是可用的here

【讨论】:

  • 非常感谢您,这是一个非常重要的区别。
【解决方案2】:

结束在 cmets 中的对话:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2013-04-02
    • 1970-01-01
    • 2011-06-24
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多