13.1.18. 代码分析器¶
Window → Show Code Profiler 会为运行在所连接摄像头上的固件打开一个函数级分析器:哪些 C 函数运行了、运行了多少次,以及微秒都花在了哪里,在脚本执行时实时流式显示。它回答了 FPS 计数器提出的问题——这条流水线为什么这么慢——而且是在摄像头自身代码的层面上回答的。
分析支持是编译进固件的,并非始终存在:摄像头必须运行以 PROFILE_ENABLE=1 构建的固件,否则该菜单项将保持禁用状态。构建这样的固件是 构建固件 中介绍的自定义构建工作流的一部分。
分析器正在观察脚本运行:每个函数的调用次数、计时和占总时间的百分比,最右侧两列是硬件事件计数器,下方是合计行。¶
该窗口是一个可排序的函数表,列出它们的调用次数、最小、最大、总计和平均微秒数、平均周期数以及占总时间的百分比,下方有一行合计,还有一个用于按名称查找函数的过滤框。函数名来自固件的 ELF 文件——将窗口的固件路径字段指向构建生成的 .elf,地址就会解析为函数名。
两个视图控件用于组织数据。Flat 独立地对每个函数进行排名——这是回答“哪个单一函数开销最大”的视图。Tree 将被调用者嵌套在调用者之下,展示时间如何沿调用链分解。与此独立地,Inclusive 将一个函数所调用的一切所花的时间都计入该函数,而 Exclusive 只计入函数自身主体的时间——inclusive 找出开销大的子系统,exclusive 找出开销大的循环。Reset 将计数器清零,这正是隔离测量流水线某一阶段的方法:复位、让它运行、读取。
分析器还可以显示硬件事件计数器——缓存未命中、分支预测错误,以及处理器能够计数的其他事件——与计时列并排显示;在构建了相应支持的固件上,可在同一窗口中选择它们。
参见
openmv 包的 CLI 可以从命令行将相同的分析数据叠加到实时流上——参见 openmv 命令行工具(CLI)。