性能分析
问题
如何定位 Rust 程序的性能瓶颈?
答案
火焰图
# 安装
cargo install flamegraph
# 生成火焰图(Linux 需要 perf,macOS 需要 dtrace)
cargo flamegraph --bin my-app
# 生成 flamegraph.svg,浏览器打开
火焰图的阅读方法:
- X 轴:函数占用的 CPU 时间比例(越宽越耗时)
- Y 轴:调用栈深度
- 顶部宽的函数 = 热点函数
常用分析工具
| 工具 | 平台 | 分析内容 |
|---|---|---|
flamegraph | Linux/macOS | CPU 火焰图 |
perf | Linux | 系统级 CPU 分析 |
Instruments | macOS | CPU、内存、IO |
dhat | 跨平台 | 堆分配分析 |
valgrind --tool=callgrind | Linux | 指令级分析 |
cargo-bloat | 跨平台 | 二进制大小 |
dhat 堆分配分析
#[global_allocator]
static ALLOC: dhat::Alloc = dhat::Alloc;
fn main() {
let _profiler = dhat::Profiler::new_heap();
// ... 你的代码
// 退出时自动生成报告
}
输出会告诉你哪些代码分配了最多的堆内存,帮助你减少不必要的分配。
常见面试问题
Q1: 性能分析的常见步骤?
答案:
- 确认是 release 构建(debug 模式性能差 10-100x)
- 生成火焰图找到热点函数
- 分析热点:是 CPU 密集?IO 等待?内存分配?
- 针对性优化:算法改进 > 减少分配 > 数据结构优化 > SIMD
- bench 验证:用 criterion 确认优化效果
- 回归保护:将 bench 加入 CI
Q2: debug 和 release 构建的性能差距有多大?
答案:
通常 10-100 倍。原因:
- debug 无优化(
opt-level = 0) - debug 有边界检查、溢出检查
- debug 不做内联
永远不要用 debug 构建做性能测试。