提升状态图与Meta状态机

Fir*_*his 139 c++ boost state-machine boost-statechart boost-msm

显然,boost包含两个独立的状态机库:StatechartMeta State Machine(MSM).标语给出了非常相似的描述:

  • Boost.Statechart - 任意复杂的有限状态机可以用易于阅读和维护的C++代码实现.
  • 元状态机 - 用于富有表现力的UML2有限状态机的高性能库.

你知道两者之间的主要区别和选择考虑因素是什么?

Chr*_*nry 113

由于似乎有很大的兴趣,请允许我提出我的(明显有偏见的)意见,因此应该采取一些措施:

  • MSM要快得多
  • MSM不需要RTTI或任何虚拟的东西
  • MSM具有更完整的UML2支持(例如内部转换,符合UML的正交区域)
  • MSM提供描述性语言(实际上是几种).例如,使用eUML前端,转换可以描述为Source + Event [Guard]/Action == Target
  • MSM将使您的编译器受到更大状态机的影响,因此您需要一个非常新的编译器(g ++> = 4.x,VC> = 9)

通过查看MSM审核期间发布的评论,您可以使自己更好.这个主题在开发人员列表中进行了大量讨论.

  • 次要挑选:在发布模式下,使用C++ RTTI(dynamic_cast,typeid)是Boost.Statechart的严格选择. (16认同)
  • 非常感谢你.听取开发者本身的意见是一种乐趣!现在我们只需要Andreas Huber的回复:) (2认同)

小智 109

正如Christophe已经提到的,两个库之间的关键差异之一是运行时性能.虽然MSM可能提供了最好的功能,但Statechart可以有意识地将内存和处理器周期换成更好的可扩展性.

使用Boost.Statechart,您可以通过多种翻译单元(cpp文件)以您无法使用MSM的方式传播状态机的布局(即状态,转换).这使您可以使大型FSM的实现更易于维护,并且比使用MSM更快地编译.

当您自问每个应用每秒要处理多少事件时,状态图与MSM相比的性能开销是否真的对您的应用程序来说实际上非常重要.

假设使用Boost.Statechart实现了中等复杂的FSM,这里有几个球场数字:

  • 大多数当前的PC硬件将轻松应对每秒> 100'000个事件
  • 即使资源非常有限的硬件也能够每秒处理几百个事件.

关于CPU负载,如果要处理的事件数远远低于这些数,则与MSM相比,Boost.Statechart开销几乎肯定不会引人注意.如果这个数字要高得多,你肯定会更好地使用MSM.

有关性能/可伸缩性权衡的更多深入信息,请访问:http: //www.boost.org/doc/libs/1_45_0/libs/statechart/doc/performance.html

  • 嗨安德烈亚斯,关于布局的传播,有一些改进.您现在可以在不同的核心上编译子机器.它并不完美,但有明显改善.请参阅http://svn.boost.org/svn/boost/trunk/libs/msm/doc/HTML/ch03s05.html#d0e2360 (9认同)

bla*_*aze 10

在编写我自己的PPP实现时,我使用状态图有三个原因:1)状态图更简单,文档更清晰; 2)我真的不喜欢UML :)

Boost文档称MSM的速度至少快20倍,但对于大型FSM来说,编译速度相当慢.

  • 虽然我同意UML的大部分是皇帝的新衣服,但状态图表在UML中实际上具有一定的价值. (7认同)
  • 当然,但我从离散数学中学习了状态图,而不是软件工程.这留下了一个标记:) (4认同)