92·性能优化进阶

基准测试 criterion

基准测试 criterion

学习目标

  1. 掌握 criterion 基本用法
  2. 理解统计显著性
  3. 比较不同实现

核心概念

基本用法

[dev-dependencies]
criterion = "0.5"

[[bench]]
name = "my_bench"
harness = false
// benches/my_bench.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion, BenchmarkId};

fn fibonacci_recursive(n: u64) -> u64 {
    match n {
        0 | 1 => n,
        _ => fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2),
    }
}

fn fibonacci_iterative(n: u64) -> u64 {
    let (mut a, mut b) = (0, 1);
    for _ in 0..n {
        let temp = a + b;
        a = b;
        b = temp;
    }
    a
}

fn bench_fibonacci(c: &mut Criterion) {
    let mut group = c.benchmark_group("fibonacci");

    for n in [10, 20, 30] {
        group.bench_with_input(
            BenchmarkId::new("recursive", n),
            &n,
            |b, &n| b.iter(|| fibonacci_recursive(black_box(n))),
        );
        group.bench_with_input(
            BenchmarkId::new("iterative", n),
            &n,
            |b, &n| b.iter(|| fibonacci_iterative(black_box(n))),
        );
    }

    group.finish();
}

criterion_group!(benches, bench_fibonacci);
criterion_main!(benches);

运行

cargo bench

# 查看报告
open target/criterion/report/index.html

自定义配置

use criterion::{Criterion, SamplingMode};

fn bench_config(c: &mut Criterion) {
    let mut group = c.benchmark_group("my_group");
    group.sample_size(100);        // 采样次数
    group.sampling_mode(SamplingMode::Flat);
    group.measurement_time(std::time::Duration::from_secs(5));

    group.bench_function("my_fn", |b| {
        b.iter(|| { /* ... */ })
    });

    group.finish();
}

小结

API用途
c.bench_function单函数基准测试
BenchmarkId参数化测试
benchmark_group分组比较
black_box防止编译器优化掉代码

练习编辑器

rust
Loading...