C++ 对于简单的应用程序,boost::signals2是否过度杀伤力?
在受限于C++ 对于简单的应用程序,boost::signals2是否过度杀伤力?,c++,c++11,boost,signals-slots,boost-signals2,C++,C++11,Boost,Signals Slots,Boost Signals2,在受限于C++03的环境中,boost::signals2与boost::function和boost::bind一起使用,以实现组件之间的简单消息传递系统。它工作得很好,我对它没有任何问题 但是,在另一个完全支持C++11的环境中,对于非常简单的应用程序来说,boost::signals2是不是太过了? 为了澄清,我所说的简单是指以下内容: 单螺纹 所有信号都具有返回类型void 性能是此应用程序的关键,因此应用程序不需要的所有boost::signals2奇迹可能弊大于利 现在,有一个简
C++03
的环境中,boost::signals2
与boost::function
和boost::bind
一起使用,以实现组件之间的简单消息传递系统。它工作得很好,我对它没有任何问题
但是,在另一个完全支持C++11
的环境中,对于非常简单的应用程序来说,boost::signals2是不是太过了?
为了澄清,我所说的简单是指以下内容:
- 单螺纹
- 所有信号都具有返回类型
void
boost::signals2
奇迹可能弊大于利
现在,有一个简单的
std::vector
来处理这个问题,如果认为合适的话,切换到其他东西,如boost::signals2
将非常简单。结束评论中的对话:
似乎这个问题已经归结为,停止理论化,开始基准测试
最后,我发现
boost::signals2
的一些附加功能非常有用(例如插槽上的.track
),值得任何性能成本(如果有的话),它们产生了。我最近在一个具有类似简单需求的项目中遇到了相同的问题,并做了一些研究,我想在这里分享
我的主要兴趣是与回调函数实现的简单向量相比,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
基准持续时间(标准化)
---------------------------------------------------------------------
直接函数调用1
函数指针调用1
虚拟函数调用1
std::函数调用1.5
向量调用2
boost::信号调用78
boost::signals2信号调用(虚拟互斥)43
boost::信号2信号调用92
这些测量是在Ubuntu 15.04和GCC4.9.2、optimization-O2、BoostV1.55上进行的。因为绝对值在我的框外可能毫无意义,所以这些值是标准化的。更新版本的Boost可能会更快
我的结论是:如果性能至关重要,并且您不需要线程安全(或其他高级功能),请重新考虑使用boost::signals2
如果您想在您的机器上重现测量值,代码是可用的。那么,您的探查器从
Boost.Signals2
中告诉您的CPU/内存使用量是多少?这甚至是一个瓶颈吗?如果性能是关键,我通常会发现自己没有实现可订阅的事件或可观察的。这永远是一个独立的处理层。正如安德烈·亚历山德雷斯库所说<代码>唯一的好直觉:“我应该时间。”三个C++优化提示,似乎这个问题已经归结为,停止理论化,开始标杆。谢谢你的帮助。@IgorR。谢谢你,在阅读了这篇文章和其他一些文章之后,我最终使用了boost::signals2:)非常感谢你,这是一个非常显著的区别。