性能分析与调优
学习目标
- 掌握性能分析工具
- 理解火焰图
- 掌握优化策略
核心概念
基准测试
[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }
// benches/my_benchmark.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};
fn fibonacci(n: u64) -> u64 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
cargo bench
火焰图
# 安装
cargo install flamegraph
# 生成火焰图
cargo flamegraph
# 指定二进制
cargo flamegraph --bin my_app
常见优化
// 1. 避免不必要的克隆
fn bad(data: &Vec<String>) -> Vec<String> {
data.clone() // ❌ 克隆整个 Vec
}
fn good(data: &[String]) -> &[String] {
data // ✅ 返回引用
}
// 2. 使用迭代器而非循环
fn sum_v1(data: &[i32]) -> i32 {
let mut sum = 0;
for i in 0..data.len() {
sum += data[i]; // ❌ 每次检查边界
}
sum
}
fn sum_v2(data: &[i32]) -> i32 {
data.iter().sum() // ✅ 编译器可以优化
}
// 3. 预分配容量
fn collect_v1(n: usize) -> Vec<i32> {
let mut v = Vec::new();
for i in 0..n {
v.push(i); // 可能多次重新分配
}
v
}
fn collect_v2(n: usize) -> Vec<i32> {
let mut v = Vec::with_capacity(n);
for i in 0..n {
v.push(i); // 不会重新分配
}
v
}
小结
| 工具 | 用途 |
|---|---|
criterion | 基准测试 |
flamegraph | 火焰图 |
perf | Linux 性能分析 |
cargo bench | 运行基准测试 |
练习编辑器
rust
Loading...