Rust性能测试库criterion-macro的使用:高效基准测试与宏扩展工具
Rust性能测试库criterion-macro的使用:高效基准测试与宏扩展工具
criterion-macro
crate提供了一个过程宏,允许使用#[criterion]
来标记Criterion.rs的基准测试函数。
许可证
该项目采用以下任一许可证:
- Apache License, Version 2.0
- MIT License
安装
在项目目录中运行以下Cargo命令:
cargo add criterion-macro
或者在Cargo.toml中添加以下行:
criterion-macro = "0.4.0"
完整使用示例
下面是一个使用criterion-macro
进行基准测试的完整示例:
// 导入必要的库
use criterion_macro::criterion;
use criterion::{black_box, Criterion};
// 定义一个需要测试的函数
fn fibonacci(n: u64) -> u64 {
match n {
0 => 1,
1 => 1,
n => fibonacci(n-1) + fibonacci(n-2),
}
}
// 使用criterion宏定义基准测试
#[criterion]
fn bench_fib(c: &mut Criterion) {
// 创建基准测试组
c.bench_function("fib 20", |b| {
// 使用black_box防止编译器优化
b.iter(|| fibonacci(black_box(20)))
});
}
// 主函数配置criterion
fn main() {
// 初始化criterion
let mut criterion = Criterion::default();
// 运行所有基准测试
bench_fib(&mut criterion);
// 生成报告
Criterion::default()
.configure_from_args()
.final_summary();
}
代码说明
fibonacci
函数是一个简单的递归实现,用于计算斐波那契数列#[criterion]
宏用于标记基准测试函数bench_fib
函数定义了一个名为"fib 20"的基准测试black_box
用于防止编译器优化测试代码- 主函数配置并运行基准测试,最后生成报告
贡献
欢迎所有想要贡献的人。贡献必须遵守Rust的行为准则。
资源
- 主页: bheisler.github.io/criterion.rs/book/index.html
- 文档: docs.rs/criterion-macro/0.4.0
- 仓库: github.com/bheisler/criterion.rs
所有者
- Brook Heisler
- David Himmelstrup
分类
- 开发工具::性能分析
完整示例demo
下面是一个更完整的示例,展示了如何使用criterion-macro进行多个基准测试:
// 导入必要的库
use criterion_macro::criterion;
use criterion::{black_box, Criterion};
// 定义两个测试函数
fn fast_function(n: u64) -> u64 {
n * 2
}
fn slow_function(n: u64) -> u64 {
(0..n).fold(0, |acc, x| acc + x)
}
// 使用criterion宏定义基准测试组
#[criterion]
fn bench_fast(c: &mut Criterion) {
// 测试快速函数
c.bench_function("fast 100", |b| {
b.iter(|| fast_function(black_box(100)))
});
// 测试快速函数的不同输入
c.bench_function("fast 1000", |b| {
b.iter(|| fast_function(black_box(1000)))
});
}
#[criterion]
fn bench_slow(c: &mut Criterion) {
// 测试慢速函数
c.bench_function("slow 10", |b| {
b.iter(|| slow_function(black_box(10)))
});
// 测试慢速函数的不同输入
c.bench_function("slow 100", |b| {
b.iter(|| slow_function(black_box(100)))
});
}
// 主函数配置并运行所有基准测试
fn main() {
let mut criterion = Criterion::default();
// 运行所有基准测试
bench_fast(&mut criterion);
bench_slow(&mut criterion);
// 生成最终报告
Criterion::default()
.configure_from_args()
.final_summary();
}
这个示例展示了:
- 定义了两个不同性能特征的函数
- 为每个函数创建了多个基准测试
- 每个基准测试测试不同的输入大小
- 在主函数中运行所有基准测试并生成报告
1 回复
Rust性能测试库criterion-macro的使用:高效基准测试与宏扩展工具
介绍
criterion-macro是Rust生态中一个强大的性能测试库,它基于criterion.rs构建,提供了更简洁的宏语法来编写基准测试。这个库特别适合需要精确测量代码性能的场景,同时通过宏简化了测试代码的编写。
主要特点
- 简洁的宏语法,减少样板代码
- 提供详细的统计分析和可视化结果
- 支持对比基准测试
- 自动检测性能回归
- 生成HTML报告
完整示例代码
// 引入必要的库
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
use criterion_macro::criterion;
// 递归实现的斐波那契数列
fn fibonacci_recursive(n: u64) -> u64 {
match n {
0 => 1,
1 => 1,
n => fibonacci_recursive(n-1) + fibonacci_recursive(n-2),
}
}
// 迭代实现的斐波那契数列
fn fibonacci_iterative(n: u64) -> u64 {
let mut a = 1;
let mut b = 1;
for _ in 0..n {
let c = a + b;
a = b;
b = c;
}
a
}
// 基本性能测试示例
#[criterion]
fn basic_benchmark(c: &mut Criterion) {
c.bench_function("fib_recursive_20", |b| b.iter(|| fibonacci_recursive(20)));
}
// 带参数的基准测试
#[criterion]
fn parameterized_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("Fibonacci Variants");
for i in [10, 20, 30].iter() {
group.bench_with_input(
BenchmarkId::new("Recursive", i),
i,
|b, &n| b.iter(|| fibonacci_recursive(n))
);
}
group.finish();
}
// 对比测试
#[criterion]
fn comparison_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("Fibonacci Comparison");
group.bench_function("Recursive 20", |b| b.iter(|| fibonacci_recursive(20)));
group.bench_function("Iterative 20", |b| b.iter(|| fibonacci_iterative(20)));
group.finish();
}
// 自定义配置测试
#[criterion]
fn custom_config_benchmark(c: &mut Criterion) {
let mut criterion = Criterion::default()
.sample_size(1000)
.warm_up_time(std::time::Duration::from_secs(1));
criterion.bench_function("fib_15_custom", |b| b.iter(|| fibonacci_recursive(15)));
}
// 吞吐量测试
#[criterion]
fn throughput_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("Throughput Measurement");
group.throughput(Throughput::Elements(1));
group.bench_function("fib_10", |b| b.iter(|| fibonacci_recursive(10)));
group.throughput(Throughput::Elements(10));
group.bench_function("fib_20", |b| b.iter(|| fibonacci_recursive(20)));
group.finish();
}
// 定义测试组
criterion_group!(
benches,
basic_benchmark,
parameterized_benchmark,
comparison_benchmark,
custom_config_benchmark,
throughput_benchmark
);
// 定义主函数
criterion_main!(benches);
运行测试
运行基准测试使用以下命令:
cargo bench
测试结果会显示在终端,并生成HTML报告保存在target/criterion
目录下。
注意事项
- 基准测试应该在发布模式下运行(
--release
标志) - 避免在基准测试中包含过多的初始化代码
- 对于微小函数,考虑使用
black_box
防止编译器过度优化 - 多次运行以获得稳定的结果
criterion-macro通过简化API使得性能测试更加直观,同时保持了criterion.rs的所有强大功能,是Rust项目中进行性能分析和优化的理想工具。