性能分析
在发布模式中编译 `oxlint`,并包含调试信息
进行性能分析时,你需要在发布模式中编译 `oxlint` 二进制文件,并启用调试信息。你可以通过向 `cargo build` 传递 `--profile release-with-debug` 来实现此目的
cargo build --profile release-with-debug --bin oxlint
编译后,二进制文件将位于 `./target/release-with-debug/oxlint`。这是应该用于性能分析的二进制文件。
CPU - Samply
Samply 是一个使用 Firefox 分析器作为其 UI 的命令行 CPU 分析器。适用于 macOS 和 Linux。
要将 Samply 与 `oxlint` 一起使用,请运行 `samply record`,后跟 `oxlint` 命令和参数
samply record ./target/release-with-debug/oxlint .
为了提升性能分析体验,你可以考虑以下一些选项
oxlint
:--silent
将禁止诊断输出,并让分析更集中。oxlint
:--threads 1
将单线程运行检查器,这虽然速度较慢,但使针对单线程性能进行分析变得更容易。samply record
:--rate <number>
将以更高的速率对分析进行采样。默认值为 1000Hz(1ms),但增加此值将提供更多详细信息,但代价是分析文件较大。
例如,针对单线程运行 `oxlint`,采样率为 0.1ms
samply record --rate 10000 ./target/release-with-debug/oxlint --silent --threads 1 .
CPU - Mac Xcode Instruments
cargo-instruments
是桥接 Mac Xcode instruments 的首选工具。
以下说明复制了 cargo instruments
的过程。
首先,安装 Xcode Instruments 命令行工具
xcode-select --install
然后,如果你还没有这样做,确保编译了 oxlint
二进制文件。
cargo instruments
在幕后调用 xcrun xctrace
命令,等同于
xcrun xctrace record --template 'Time Profile' --output . --launch -- /path/to/oxc/target/release-with-debug/oxlint
运行以上命令会生成以下输出
Starting recording with the Time Profiler template. Launching process: oxlint.
Ctrl-C to stop the recording
Target app exited, ending recording...
Recording completed. Saving output file...
Output file saved as: Launch_oxlint_2023-09-03_4.41.45 PM_EB179B85.trace
打开跟踪文件 open Launch_oxlint_2023-09-03_4.41.45\ PM_EB179B85.trace
。
查看自顶向下的跟踪
- 在顶部面板中,单击 CPU
- 在左侧输入框中,单击
x
,然后选择时间分析器
- 在底部面板中,单击“调用树”,开启“反转调用树”并关闭按线程分隔。
对于内存和磁盘操作,使用 --template 'Allocations'
和 --template '文件活动'
。
要获得更详细的 CPU 配置文件,例如 L1/L2 高速缓存未命中、周期和指令计数,以及分支预测信息,你需要使用自定义的“CPU 计数器”模板
- 打开 Instruments 并选择“CPU 计数器”模板。
- 在“CPU 计数器”设置中
- 开启“高频采样”选项。
- 在“高频采样”选项下方,单击加号图标并选择事件类型。一些建议事件类型
- 周期 - 粗略了解在每个函数中花费了多少 CPU 周期。
- 指令 - 粗略了解在每个函数中执行了多少 CPU 指令以及花费了多少周期
L1D_CACHE_MISS_LD
- 从内存中加载数据时 L1 高速缓存未命中计数
- 在你启用了自己感兴趣的事件后,在“文件 > 另存为模板 ...”中保存模板并给它一个名称。
- 现在你可以将它与
xctrace
一起使用,方法是将模板名称传递给--template
选项:xcrun xctrace record --template '我的自定义 CPU 计数器' --output . --launch -- /path/to/oxc/target/release-with-debug/oxlint
堆分配
试用 dhat。