跳到主要内容

性能分析

问题

如何定位 Rust 程序的性能瓶颈?

答案

火焰图

# 安装
cargo install flamegraph

# 生成火焰图(Linux 需要 perf,macOS 需要 dtrace)
cargo flamegraph --bin my-app
# 生成 flamegraph.svg,浏览器打开

火焰图的阅读方法:

  • X 轴:函数占用的 CPU 时间比例(越宽越耗时)
  • Y 轴:调用栈深度
  • 顶部宽的函数 = 热点函数

常用分析工具

工具平台分析内容
flamegraphLinux/macOSCPU 火焰图
perfLinux系统级 CPU 分析
InstrumentsmacOSCPU、内存、IO
dhat跨平台堆分配分析
valgrind --tool=callgrindLinux指令级分析
cargo-bloat跨平台二进制大小

dhat 堆分配分析

#[global_allocator]
static ALLOC: dhat::Alloc = dhat::Alloc;

fn main() {
let _profiler = dhat::Profiler::new_heap();
// ... 你的代码
// 退出时自动生成报告
}

输出会告诉你哪些代码分配了最多的堆内存,帮助你减少不必要的分配。


常见面试问题

Q1: 性能分析的常见步骤?

答案

  1. 确认是 release 构建(debug 模式性能差 10-100x)
  2. 生成火焰图找到热点函数
  3. 分析热点:是 CPU 密集?IO 等待?内存分配?
  4. 针对性优化:算法改进 > 减少分配 > 数据结构优化 > SIMD
  5. bench 验证:用 criterion 确认优化效果
  6. 回归保护:将 bench 加入 CI

Q2: debug 和 release 构建的性能差距有多大?

答案

通常 10-100 倍。原因:

  • debug 无优化(opt-level = 0
  • debug 有边界检查、溢出检查
  • debug 不做内联

永远不要用 debug 构建做性能测试。

相关链接