91·性能优化高级

性能分析与调优

性能分析与调优

学习目标

  1. 掌握性能分析工具
  2. 理解火焰图
  3. 掌握优化策略

核心概念

基准测试

[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火焰图
perfLinux 性能分析
cargo bench运行基准测试

练习编辑器

rust
Loading...