基准测试 criterion
学习目标
- 掌握 criterion 基本用法
- 理解统计显著性
- 比较不同实现
核心概念
基本用法
[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...