使用 Simpleperf 分析 CPU
更新时间: 2026年4月17日
Simpleperf 通过以一定的频率对应用程序进行采样,确定 CPU 消耗时间的位置,以及其他与性能相关的硬件事件发生的位置。无需对代码进行任何更改即可使用 Simpleperf 进行追踪,这使得它成为快速全面了解应用性能的绝佳方式。建议使用 Simpleperf 来调试应用程序中的性能问题。
使用 Simpleperf 进行性能分析的应用程序必须是开发编译版本。Simpleperf 应安装在 Meta Quest 设备的 /bin/ 目录下,但 Android NDK 提供了从主机运行 Simpleperf 的脚本。您必须安装 Android NDK 才能使用这些脚本。
在 Unreal 引擎中,建议您使用开发配置运行,以便进行优化并获得符号。虽然不是必需,但启用优化分析可以更准确地描述您的应用在发布给用户时将如何表现。
Unreal 引擎从发布编译版本中剥离符号,但将其与构建的 APK 一起放在目录中。为了将符号提供给 Simpleperf,请将其添加到 binary_cache_builder.py 脚本:
python <ndk path>/simpleperf/binary_cache_builder.py -lib <path to apk dir>
仅在每次重新构建 APK 时需要进行一次此操作。
以下工作流程展示了如何使用 Simpleperf 来捕捉和读取性能追踪信息。
应用在您的设备上安装并运行后,使用 app_profiler.py 脚本来开始追踪记录,如下所示:
python <ndk path>/simpleperf/app_profiler.py --disable_adb_root --ndk_path <ndk path> --app <package name> -r "-g --duration <seconds> -e cpu-cycles,cache-misses"
--disable_adb_root 是必要项,以防止 app_profiler.py 尝试获取 root 访问权限,而通过使用 -r,您可以指定要传递给设备上 Simpleperf 的参数。
通过 adb shell 调用 Simpleperf(如下所示),这可以获得通过 -r 传递的额外参数的完整列表:
adb shell bin/simpleperf record --help
上面使用的参数包括:
-g - 指示 Simpleperf 记录基于 dwarf 的调用图,这将在 ARM 设备上提供比基于堆栈帧的调用图更好的支持。--duration - 允许您设置追踪运行的时间(秒)。此参数为可选参数。-e - 允许您指定想要记录的 CPU 事件。在本例中,同时记录了 cpu-cycles 和 cache-misses:
cpu-cycles - 此事件很实用,便于确定在追踪期间应用在哪个函数上花费了时间。该报告显示了与应用中的其他函数相比,CPU 时间所花费的百分比。如果不包含 -e,则此事件默认启用。cache-misses - 此事件对于找到应用中数据缓存缺失的位置很有用。与 cpu-cycles 类似,报告按百分比细分了应用中哪些函数遭受了最多的缓存缺失。此事件默认禁用,但启用它可以帮助您发现应用中的不良内存访问模式。- 使用 Simpleperf 还可以捕捉更多事件。运行
adb shell bin/simpleperf list 以获得可以通过 -e 传递的事件完整列表。
使用 app_profiler.py 捕捉追踪数据后,使用 report_html.py 查看这些数据:
python <ndk path>/simpleperf/report_html.py
系统会在默认浏览器中以网页形式打开报告。
report_html.py 生成了一个包含 3 个选项卡的页面。每个选项卡允许您在使用 -e 参数指定的不同 CPU 事件之间切换视图。
图表统计选项卡展示了从每个流程中记录的样本饼图。点击图表中的各个部分,可以查看线程、库和函数调用。
样本表选项卡展示了一个可排序和可筛选的表格,其中列出了追踪过程中采样的所有函数。点击表格中的某一行,会显示来自该函数样本的调用图。
火焰图选项卡展示了应用中每个线程的调用图。点击图中的任意函数片段将放大显示该函数。