亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial Internet of Things >> 嵌入式

最大化Qt状态机性能

若你用Qt开发应用并采用状态机,很可能在用Qt状态机框架。可用纯C++或SCXML定义机器,或从状态图生成C++代码。本文从功能、适用性、性能三维评估这些选项。

作为软件开发者,你大概写过无数switch-case块。对许多人这是无高层工具时实现状态机最简方式。但随复杂度增长,维护成挑战,手工switch-case逻辑不再可持续。

实现状态机

使用C++等面向对象语言时,状态模式是验证策略。将每状态建模为类,迁移作可选单独类。通过创建这些类实例并连接它们构建状态机。框架可显著减少样板代码。

Qt状态机API让你用简洁代码配置机器,将执行语义留给框架。虽简化实现,但状态达数十上百时源码仍可能膨胀,整体设计难把握。

Qt也支持状态图XML(SCXML),W3C状态图描述标准。手写XML繁琐,Qt Creator提供简易图形编辑器。

无论实现技术,图形模型是编辑和理解状态机最有效方式。图形模型可用SCXML文本表达,或用于生成任意语言源码,含switch-case C++或QStateMachine构造。将转换委托给工具,避免手工代码痛苦,将所有方法带至同一易用性水平。但实现本质仍不同。本文聚焦运行时行为,尤其性能。

最大化Qt状态机性能
Unsplash Photo by Austris Augusts on Unsplash

竞争者

各方法CPU占用差异如何?为答此问我创建基准套件。第一部分比较不同实现策略。竞争者如下:

  1. SCXML解释器 — 测试机器用SCXML定义,由Qt QSCXMLStateMachine类执行。
  2. 状态模式 — 测试机器用QStateMachine类实现。
  3. 纯C++代码 — 测试机器用基本switch-case法的C++类实现。

注:这些示例代码见此处。

前两变体暗示用Qt信号槽和事件队列,纯C++实现不需此基建。为使方法更可比,测试套件含两额外场景:

这让我们隔离信号槽和事件队列对执行时间影响,同时保持核心状态迁移逻辑相同。

测试状态机

所有五变体用图1状态机作基础测试场景。

最大化Qt状态机性能
图1:测试状态机,YAKINDU Statechart Tools创建。(来源:作者)

机器有六平坦状态A-F,循环遍历,对两输入事件e1和e2交替触发迁移反应。每个迁移动作给变量x加10;F到A迁移额外发射输出事件o。

最大化Qt状态机性能
图2:Qt Creator中测试状态机SCXML模型。(来源:作者)

我用YAKINDU Statechart Tools定义机器,可生成SCXML和纯switch-case C++代码。生成代码也支持Qt信号槽。我手工实现QStateMachine变体,但所有其他实现源自同一状态图定义。

每测试跑单状态循环100万迭代。循环始终以状态A激活为始终,处理600万输入事件、100万输出事件及关联迁移动作。测试作命令行应用执行,记录整批时间。单事件时间用总时间除处理事件数得出。用重复运行最低值。

基准在2014 MacBook Pro 2.4GHz四核i7优化发布构建上跑。确切数值随硬件变,但相对差异保持一致。

性能数据

纯C++处理单事件平均7ns,SCXML需33850ns——约4800倍差距。用信号槽增~72ns/事件(~90%开销)。路由经Qt事件队列增~731ns/事件(~10倍信号槽、~100倍纯C++)。扣除队列开销后,QStateMachine框架成本~4500ns/事件——约纯C++635倍慢。SCXML解释器因解释JavaScript再增~7倍,成最慢变体。

最大化Qt状态机性能
图3:单事件处理时间对比。(来源:作者)

层次与正交性影响

我也剖析同机器层次和正交变体。层次机器(图4)和正交机器(图5)行为相同但结构不同。

最大化Qt状态机性能
图4:层次测试状态图。(来源:作者)

最大化Qt状态机性能
图5:正交测试状态图。(来源:作者)

结果见图6,表明增层次在两实现中均无可测开销。正交性也未如预期加倍运行时;纯C++增约2.4倍,SCXML增约3.1倍,远低理论四倍成本。

最大化Qt状态机性能
图6:层次与正交性性能影响。(来源:作者)

结论

纯C++性能最优。信号槽和Qt事件队列以速度换便利和可维护性,QStateMachine框架是三核心变体中最慢。SCXML常对交互应用足够快,且提供运行时重配置优势。极致速度关键时,手工switch-case代码为推荐方案。

嵌入式

  1. 选对潜水泵:专家建议与关键特性指南
  2. 高端电动弯管机:精度、可靠性与成本效益
  3. 珠宝设计 CAD 软件选型全指南
  4. 仓库应急准备全攻略:构建韧性运营的综合指南
  5. 技术团队绩效监测的高效实践与关键指标体系
  6. 全球顶尖CNC机床品牌盘点:精度与可靠性的标杆
  7. 选购理想CNC机床实战指南:四大核心指标决策模型
  8. 如何选择理想风力发电机刹车确保可靠性能
  9. 装箱机选型专家指南:四大关键问题锁定最优产线方案
  10. 水刀切割机选型指南:材料适配、切割复杂度、二手性价比与验机清单
  11. 钣金折弯机选型全攻略:类型、操作模式与应用场景深度解析
  12. 提升钨铜合金性能:验证策略与加工工艺