性能分析与对比
ZStudio 中内置了程序性能分析&可视化流水线工具 ZProf,帮助用户定位从函数层级到微架构层级的性能瓶颈并进行针对性的优化。
性能分析
本节将介绍 ZStudio 中性能分析工具的使用方法。关于性能分析的示例项目,请参考 AccInst。
执行性能分析
用户在执行性能分析前,需要先成功构建项目。完成项目构建后,可以直接保持默认配置执行性能分析,点击菜单栏"性能分析" > "启动性能分析"生成性能分析数据。
性能分析完成之前不要重新执行,以免生成错误数据。完成后右下角会生成提示信息,性能分析结果将在编辑器中打开。
也可以根据需要更改性能分析配置,点击菜单栏的"性能分析" > "配置"。
性能分析配置


-
选择开发板:选择"内置"开发板或添加"自定义"开发板。
-
仿真器虚拟开发板:通过下拉框选择内置的目标虚拟开发板。
-
开发板配置文件:指定添加自定义开发板的配置文件路径。
-
-
展示统计信息:选择是否在运行控制台中打印仿真器运行可执行程序的性能统计数据,即 instructions, cycles, branch count, branch misses 以及 IPC 等数据。
-
性能结果输出目录:指定结果保存的目录名,默认为
{project_name}.zprof,所有结果将在导航栏中 zprof-output 节点下列出。 -
仿真器参数:指定传递给仿真器的参数,默认不传递任何参数。
-
分析数据覆盖:对于相同配置的同一个项目进行性能分析,是否允许最新的性能分析数据是否自动覆盖上一次数据,如果选择不自动覆盖,将为每次得到的新结果添加一个时间戳。
-
程序参数:指定传给运行项目的参数,默认不传递任何参数。
性能分析结果
性能分析结果中统计了衡量程序或代码段性能的重要指标。一般而言,性能分析结果将在性能 分析完成后自动在编辑器中打开,用户也可以手动点击菜单栏"性能分析" > "性能分析结果"打开。
程序性能分析
Program Summary 列出了程序在执行过程中的所有重要指标,如下列表所示:
| 程序性能指标 | 描述 |
|---|---|
| 时钟周期总数(Total Cycle) | 程序执行期间所花费的时钟周期总数。 |
| 指令总数(Total Instruction) | 程序执行期间执行的指令总数。 |
| 时钟周期执行的平均指令数(Instruction Per Cycle, IPC) | 指在一个时钟周期内执行的平均指令数。高 IPC 表示更好的性能。 |
| 指令缓存未命中总数(Total Instruction Cache Misses) | 在指令缓存中无法找到所需指令的次数。 |
| 数据缓存未命中(Total Data Cache Misses) | 在数据缓存中无法找到所需数据的次数。 |
| 分支方向预测失败(Total Branch Direction Prediction Misses) | 无法正确预测程序中分支的执行路径的次数。 |
| 分支或跳转目标预测失败(Total Branch or Jump Prediction Misses) | 处理器在执行分支或跳转指令时无法准确预测目标地址的次数。 |
下方列表以不同维度展示了程序的性能分析数据,帮助用户从不同层次理解程序性能,更全面地了解程序的性能瓶颈,从而选择合适的优化策略,验证优化效果。
函数执行统计
Function Summary 提供函数级别的性能指标,帮助定位程序中最耗时的函数,识别瓶颈函数。用户可以通过点击某个指标的标题 行针对该指标对函数进行从大到小或从小到大排序,例如点击 "Self Cycle",所有函数将根据函数在执行期间实际使用的处理器时钟周期数从大到小进行排序;再次点击则针对该指标进行反向排序。该视图支持多列排序,多列排序时,排序优先级按选择先后进行排布。默认先点击的列优先级最高。点击 取消所有排序。
根据统计表中的瓶颈函数,用户可以快速定位到源代码。点击列表右侧 按钮,将在编辑器右侧打开源代码文件并定位到对应的源代码位置;点击
按钮可跳转至微架构流水线视图。
统计列表中的函数指标可参考下表:
| 指标 | 描述 |
|---|---|
| Name | 项目中所有执行过的函数名 |
| Start PC / End PC | 函数在内存中的起始地址和结束地址 |
| Exec Times | 函数执行次数 |
| Self Cycle | 函数在执行期间实际使用的处理器时钟周期数 |
| Total Cycle | 包含内部调用或子任务的时钟周期数 |
| Self Instructions | 函数内部实际执行的指令数量 |
| Total Instructions | 包含被该函数调用的其他函数或子程序的指令数量 |
| Total Instructions Cache Misses | 包含被该 函数调用的其他函数或子程序的指令缓存未命中次数 |
| Self Instruction Cache Misses | 函数执行过程中自身指令缓存未命中次数 |
| Total Data Cache Misses | 包括函数调用的其他子程序的数据缓存未命中次数 |
| Self Data Cache Misses | 函数执行过程中自身数据缓存未命中次数 |
| Total Branch Direction Prediction Misses | 包含被该函数调用的其他函数或子程序的分支方向预测失败次数 |
| Self Branch Direction Prediction Misses | 函数执行中自身分支方向预测失败次数 |
| Total Branch Or Jump Prediction Misses | 包括调用的其他子程序的分支方向预测失败次数 |
| Self Branch Or Jump Prediction Misses | 函数执行中自身跳转或分支预测失败次数 |
| Total Branch Or Jump Prediction Misses | 包括调用的其他子程序的跳转或分支预测失败次数 |
指令执行统计
Instruction Summary 以指令级别分析程序的执行情况。多列排序功能可以帮助用户识别热点指令,分析指令级别的性能瓶颈。
指令类型统计
Instruction Type Summary 按照指令类型(如算术运算、逻辑运算、内存访问、分支指令等)进行分类,分析不同类型指令的占比和执行情况,帮助用户分析不同类型指令的使用情况和对性能的影响。用户可以通过排序功能识别特定类型指令的性能问题。
助记符统计
Mnemonic Summary 分析具体汇编指令的使用情况,展示各类指令的执行频率和耗时,适合进行汇编级别的优化。Mnemonic Summary 同样支持进行多列排序。
高频代码分析
ZStudio 还提供了高频代码(Code Coverage)的分析信息,包括哪些代码被执行的次数最多,占用资源多等。帮助开发者快速定位和解决性能问题,并提高程序的整体性能。
当用户从 Function Summary 或 Pipeline 跳转到源代码时,可以通过菜单栏"性能分析" > "启动代码覆盖率分析"选项获取每行代码的执行次数的信息。
获取 code coverage 数据必须使用 Debug 配置( -g )编译项目
运行完成后,可以看到代码行的右侧显示出执行次数。性能分析信息概览,例如 IPC, instructions 和 cycle 信息也将显示在代码行下,在源代码中点击"Enter Pipeline"将进入流水线视图。
用户可以自定义这些信息是否显示,使用快捷键 Control+Shift+P 打开命令面板,输入并选择选单中的 Code Editor: Toggle Profiling Summary 选项可以关闭性能分析的数据信息显示;输入并选择 Code Editor: Toggle Code Coverage 选项,可以关闭高频代码执行次数显示。
微架构流水线
微架构流水线视图(Micro Arch Pipeline)将程序中的指令可视化为流程图来表示其执行情况,标示出数据相关性的停顿泡(bubbles),并使用不同颜色进行类型区分。
用户可以通过以下方式打开流水线视图:
-
选择菜单栏"性能分析" > "微架构流水线",在选单中选择已完成的数据即可打开流水线视图。
-
从函数执行统计(Function Summary)中点击
按钮跳转至流水线视图。
-
在代码编辑器中点击"Enter Pipeline"将进入流水线视图。
微架构流水线视图(Micro Arch Pipeline)使用不同颜色区分不同类型的停顿泡(bubbles), 参考下表:
| 停顿泡 | 描述 |
|---|---|
| ICache Miss | 指令高速缓存未命中;CPU 流水线停滞,产生 bubble |
| DCache Miss | 数据高速缓存未命中;CPU 流水线停滞,产生 bubble |
| Pipeline Flush | 流水线清空;CPU 检测到分支指令或者异常处理停止当前正在执行的指令,并清空流水线中的指令,产生 bubble |
| Data Hazard | 数据冒险;当一个指令依赖于尚未完成的前一条指令的结果时,产生 bubble |
| Structural Hazard | 结构冒险;硬件资源冲突(如多个指令同时访问同一资源)导致流水线停滞,产生 bubble |
| Stalled by Previous | 前一个阶段停顿;流水线中某个阶段的执行需要等待前一个阶段完成后才能开始,产生 bubble |
指令流水线(Instruction Pipeline)视图重点关注指令的执行过程并发现指令执行中的潜在性能问题。点击下拉框查看不同类型的 bubbles,点击前进后退按钮进行同类型 bubbles 快速跳转;在搜索框中输入 PC 地址和 cycle 可以进行快速定位。
在指令流水线视图中,点击指令地址或者反汇编码可导航至源代码。
资源流水线(Resource Pipeline)视图侧重于描述计算机硬件资源之间的关系和数据流动方式,从硬件模块的维度显示了硬件资源的利用效率和数据流动方式。
用户可以选择界面左下角 "首选项" > "流水线设置",在流水线设置中自定义停顿泡颜色,以及决定横向流水线和纵向流水线是否同步滚动。
指令追踪
指令追踪(Instruction Trace)视图用于分析程序的执行指令流,可以帮助开发者更高效地理解和分析程序的行为。
通过菜单栏"性能分析" > "指令追踪",在选单中选择已完成的数据即可打开指令追踪视图。
指令追踪视图以表格的形式显示指令追踪数据,包含以下信息:
| 表头 | 说明 |
|---|---|
| Inst Id | 指令执行的顺序 |
| Commit Cycle | 指令执行完成的时间 |
| PC Addr | PC 地址 |
| Assembly Code | 汇编助记符 |
| Inst Code | 指令编码 |
表格上方的搜索框支持对以上所有内容进行搜索以及在搜索结果间导航,通过下拉框选择搜索类型,例如,“PC Addr”,然后在搜索框中输入地址值后,按 Enter 键即可高亮出搜索结果。
点击表格中的数据行可以跳转到对应的源代码位置,如果源代码不可用,右下角会提示“未找到对应的源文件”的警告信息。
性能分析对比
本节介绍如何利用性能分析对比工具,对比多个性能分析结果。通过性能分析对比,用户可以对比不同构建配置,不同微架构以及添加特殊加速指令的源码更改对性能的影响。
用户每次执行性能分析的结果都将显示在"性能分析对比"视图的左侧栏中,点击
(刷新)按钮以获取最新数据,当性能分析结果过多时,可以通过搜索框快速定位到需要对比的结果数据。
用户可以遵循以下步骤进行性能分析结果对比:
-
在主菜单中,点击"视图" > "性能分析对比" 调出对比工具。
-
在"性能分析对比"视图的左侧栏中,右键点击某个性能分析结果,并点击"选为对比基准"。
-
尝试按住 Shift 或 Ctrl 键同时选择多个结果,右击选择"对比",或者点击
按钮进行快速比较。
-
用户也通过点击
按钮打开设置窗口,调整对比项和显示方式,完成设置后,点击 "确定" 关闭窗口。
性能分析对比配置
- 选择"程序性能指标对比"的数据可视化形式:至少选择图或表格中的一种形式。
- 选择对比项:默认对比项为"指令总数","周期总数"以及"单位周期执行的指令数",用户可自行选择对比项。
- 自定义数据颜色标识:用户可以为性能分析对比中的不同数据自定义颜色标识。被设置为对比基准的数据将以固定颜色进行标识(默认为蓝色)。
-
调整完设置后,重新选择数据进行对比,性能分析对比视图将在编辑器中打开。
用户可以通过右上角下拉框更改性能分析对比基准,对比基准应用于程序性能对比和函数执行对比中的所有数据;被设置为对比基准的数据将以固定颜色进行标识(默认为蓝色)。
程序性能指标对比
程序性能指标对比统计了程序在执行过程中所有重要性能数据,用户可以在"性能分析对比设置"中指定需要对比的数据指标并过滤掉不需要的对比项。
程序性能指标对比图根据指标的不同单位呈现为三组柱状图对比结果,横轴为指标名,纵轴为指标数据。Legend 按钮可以控制性能分析结果图例的显示。
程序性能指标对比表根据基准数计算出指标变化的幅度;绿色和红色区分变化性质,绿色表示对比基准降低,红色则表示对比基准数据升高。
函数执行统计对比
函数执行统计对比显示了程序执行过程中所有函数的重要指标, 用户点击某个指标的标题行可以针对基准数据对该指标进行从大到小排序。 每组指标数据项根据基准目标计算出函数针对该指标的变化幅度;绿色和红色区分数据变化性质,绿色表示对比基准降低,红色则表示对比基准数据升高。
用户可以通过搜索关键函数过滤显示结果,在搜索框中输入函数名然后键入 Enter 过滤结果。

鄂公网安备 42018502007513