Perfetto基本使用
\(\require{physics}\)
Profiling V.S. Tracing
先给结论:Profile 负责回答“慢在哪里”,Trace 负责回答“为什么会慢”。
参考 Tracing 101,两者可以这样区分:
Profiling(采样/热点分析)
- 典型工具:VTune、Linux perf、pprof
- 结果:热点函数、调用栈、CPU 占比、内存热点
- 优势:开销相对小,便于长期趋势对比
- 局限:上下文较弱,跨线程因果关系不直观
Tracing(时序/因果分析)
- 典型工具:Perfetto
- 结果:时间线、线程切换、跨线程流转、阶段耗时、Counter 曲线
- 优势:上下文完整,适合分析卡顿、抖动、排队、阻塞
- 局限:数据量大,采集策略需要设计
什么时候该用哪一个
CI 持续监控性能
优先使用 Profile + 基准指标,Trace 作为补充:
- 在 CI 固定场景跑 benchmark(吞吐、延迟、峰值内存)
- 配合采样 profiler 记录热点函数占比趋势
- 指标回归时,再触发短时 Trace 采集做定位
核心原因:CI 更强调低开销、稳定和可比较。
性能问题分析
优先使用 Trace(必要时配合 Profile):
- 先用 Perfetto 看问题发生时刻的完整时序
- 定位长耗时切片、线程等待、队列堆积
- 再用 VTune/perf 深挖具体函数级热点
实践上常见组合是:
- 第一步 Profile:快速缩小范围
- 第二步 Trace:解释因果链路
Perfetto C++ SDK
下面给一个基于官方 example.cc 思路整理的示例,覆盖 TrackEvent 的常见能力:
- Slice(作用域事件 / BEGIN-END)
- Instant(瞬时事件)
- Counter(数值曲线)
- Track(自定义轨道)
- Flow(跨阶段关联)
- Debug Annotation / lambda 自定义字段
- DynamicString(动态事件名)
SDK 使用方式可能随版本变化,若编译时报错,请以官方仓库当前版本的
examples/sdk/example.cc 为准。目前使用的 SDK 版本为
v50.1
1 |
|
对应的 CMakeLists.txt:
1 | cmake_minimum_required(VERSION 3.13) |
Windows 下使用 MSVC 的一些编译说明:
- 必须使用 C++ 17 标准
- 最好使用 vc142 工具链(VS 2019),vc143 不一定支持(能编过就能用)
- 头文件引入顺序也可能造成编译报错,例如自定义的宏影响,可以将
perfetto.h放在第一个位置引入以规避这类问题 /bigobj:Perfetto 的聚合源文件符号较多,MSVC 默认节数量上限容易触发编译错误WIN32_LEAN_AND_MEAN+NOMINMAX:减少windows.h宏污染,避免与 C++ 标准库冲突ws2_32:Windows 网络相关符号需要显式链接/permissive-:开启 MSVC 严格语法模式,更接近标准 C++ 的行为,减少编译器扩展导致的隐性兼容问题
Perfetto 官方编译说明里提到:Windows
下 clang-cl 路线通常更稳定(功能支撑 chrome://tracing
),纯 MSVC 属于 best-effort
维护(能编过就凑合用,不能也不会单独维护)。
clang-cl support is more stable because that build configuration is actively covered by the Chromium project (Perfetto rolls into chromium and underpins chrome://tracing). The MSVC build is maintained best-effort.
常用 Track Event 类型
TRACE_EVENT("cat", "name")- 最常用,记录一个作用域的耗时(函数、阶段、任务)
TRACE_EVENT_BEGIN/TRACE_EVENT_END- 手动控制切片边界,不依赖作用域结束,但必须成对存在!
TRACE_EVENT_INSTANT- 打点型事件(点击、状态切换、关键分支命中),用于在 Time Line 中添加竖线 + 标签,让我们更清楚的了解函数执行到哪一步
TRACE_COUNTER- 记录数值曲线,例如渲染帧率、内存占用率等,常用于事件循环(任务队列中待处理的任务数)、render loop 中(FPS值)
为区分 Track Event,还可以让 perfetto 在记录过程中记录每一次函数执行参数,便于理解函数在哪种输入场景下表现异常。
Offline Perfetto-UI
在官网的介绍文档中提到:Perfetto 提供一个基于网页的 UI,用于可视化时序数据。
- Fully local, browser-based UI for visualizing large amounts of complex, interconnected data on a timeline. Our UI works in all major browsers, doesn't require any installation, works offline, and can open traces recorded by other (non-Perfetto) tracing tools.
但是直接编译 UI 太过麻烦,而且在 Windows 完全无法编译。为此,可以通过脚本将 https://ui.perfetto.dev/ 完整下载到本地,然后通过本地 HTTP Server 部署,实现 Perfetto-UI 离线使用。
整体流程如下:
下载
index.html,解析最新稳定版本号根据稳定版本号下载对应
manifest.json根据
manifest.json下载全部资源文件使用本地 HTTP Server 部署静态页面
打开浏览器加载 Perfetto-UI
完整下载脚本(PowerShell,generated by GPT 5.3 Codex)如下:
1 | $Root = "D:\perfetto-ui-local" |
本地部署静态页面时推荐使用 Caddy,并搭配下面的启动脚本,实现开箱即用效果,避免繁琐的手动编译步骤(甚至在 Windows 下完全无法编译😅):
1 | @echo off |
在其他平台下部署静态页面也是同样原理,这里不再展开,最后给一张运行效果图:
