Rust性能测试兼容库codspeed-bencher-compat的使用,无缝对接Criterion和Bencher基准测试框架

Rust性能测试兼容库codspeed-bencher-compat的使用,无缝对接Criterion和Bencher基准测试框架

安装

cargo add --dev codspeed-bencher-compat --rename bencher

注意:这会安装codspeed-bencher-compat crate并在你的Cargo.toml中将其重命名为bencher。这样你可以保留现有的导入,兼容层会处理其余部分。

使用兼容层不会改变你的基准测试套件的行为,Bencher仍会像往常一样运行它。

如果你愿意,也可以直接安装codspeed-bencher-compat并更改导入以使用这个新的crate名称。

使用

让我们从Bencher文档中的示例开始,为2个简单函数创建基准测试套件(在benches/example.rs中):

use bencher::{benchmark_group, benchmark_main, Bencher};

fn a(bench: &mut Bencher) {
    bench.iter(|| {
        (0..1000).fold(0, |x, y| x + y)
    })
}

fn b(bench: &mut Bencher) {
    const N: usize = 1024;
    bench.iter(|| {
        vec![0u8; N]
    });

    bench.bytes = N as u64;
}

benchmark_group!(benches, a, b);
benchmark_main!(benches);

创建Bencher基准测试的最后一步是在你的Cargo.toml中添加新的基准测试目标:

[[bench]]
name = "example"
harness = false

就这样!你现在可以使用CodSpeed运行你的基准测试套件了:

$ cargo codspeed build
    Finished release [optimized] target(s) in 0.12s
    Finished built 1 benchmark suite(s)

$ cargo codspeed run
   Collected 1 benchmark suite(s) to run
     Running example
Using codspeed-bencher-compat v1.0.0 compatibility layer
NOTICE: codspeed is enabled, but no performance measurement will
be made since it's running in an unknown environment.
Checked: benches/example.rs::a (group: benches)
Checked: benches/example.rs::b (group: benches)
        Done running bencher_example
    Finished running 1 benchmark suite(s)

完整示例代码

以下是完整的基准测试示例:

  1. 首先,在Cargo.toml中添加依赖和基准测试配置:
[dev-dependencies]
codspeed-bencher-compat = { version = "3.0.5", package = "codspeed-bencher-compat", rename = "bencher" }

[[bench]]
name = "example"
harness = false
  1. 创建基准测试文件benches/example.rs
// 导入必要的模块
use bencher::{benchmark_group, benchmark_main, Bencher};

// 第一个基准测试函数 - 计算0到1000的和
fn a(bench: &mut Bencher) {
    bench.iter(|| {
        (0..1000).fold(0, |x, y| x + y)
    })
}

// 第二个基准测试函数 - 创建1024字节的向量
fn b(bench: &mut Bencher) {
    const N: usize = 1024;
    bench.iter(|| {
        vec![0u8; N]
    });

    // 设置每次迭代处理的字节数
    bench.bytes = N as u64;
}

// 创建基准测试组并指定要运行的函数
benchmark_group!(benches, a, b);

// 生成基准测试主函数
benchmark_main!(benches);
  1. 运行基准测试:
# 构建基准测试
cargo codspeed build

# 运行基准测试
cargo codspeed run

1 回复

Rust性能测试兼容库codspeed-bencher-compat使用指南

codspeed-bencher-compat是一个Rust性能测试兼容库,它允许开发者无缝对接Criterion和Bencher这两个流行的Rust基准测试框架,同时与CodSpeed性能监控平台兼容。

主要特性

  • 兼容现有的Criterion和Bencher基准测试代码
  • 无需修改现有测试即可接入CodSpeed平台
  • 保持与原生框架相同的API体验
  • 提供更精确的性能测量结果

安装方法

在项目的Cargo.toml文件中添加依赖:

[dev-dependencies]
codspeed-bencher-compat = "0.1"
criterion = "0.4"  # 可选,如果使用Criterion
bencher = "1.0"    # 可选,如果使用Bencher

使用方法

1. 兼容Criterion的使用示例

use codspeed_bencher_compat::{criterion_group, criterion_main, Bencher, Criterion};

// 斐波那契数列计算函数
fn fibonacci(n: u64) -> u64 {
    match n {
        0 => 1,
        1 => 1,
        n => fibonacci(n - 1) + fibonacci(n - 2),
    }
}

// 基准测试函数
fn bench_fib(b: &mut Bencher) {
    b.iter(|| fibonacci(20));  // 测试计算fibonacci(20)的性能
}

// Criterion基准测试配置
fn criterion_benchmark(c: &mut Criterion) {
    c.bench_function("fib 20", bench_fib);  // 注册基准测试
}

// 定义测试组和主函数
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);

2. 兼容Bencher的使用示例

use codspeed_bencher_compat::{bench, bench_fn, Bencher};

// 斐波那契数列计算函数
fn fibonacci(n: u64) -> u64 {
    match n {
        0 => 1,
        1 => 1,
        n => fibonacci(n - 1) + fibonacci(n - 2),
    }
}

// 基准测试函数
fn bench_fib(b: &mut Bencher) {
    b.iter(|| fibonacci(20));  // 测试计算fibonacci(20)的性能
}

// 注册基准测试
bench_fn!(bench_fib);

运行基准测试

运行基准测试的方式与原生框架相同:

# 对于Criterion兼容的测试
cargo bench

# 对于Bencher兼容的测试
cargo bench --bench your_benchmark_name

集成CodSpeed

要使用CodSpeed进行性能监控,只需安装CodSpeed CLI并运行:

# 安装CodSpeed CLI
cargo install codspeed-cargo

# 使用CodSpeed运行基准测试
cargo codspeed bench

注意事项

  1. 该库会检测是否在CodSpeed环境下运行,如果不是,则回退到原始框架行为
  2. 测量结果在CodSpeed环境下会更加精确和稳定
  3. 无需修改现有的基准测试代码即可获得CodSpeed的优势

迁移指南

如果已有项目使用Criterion或Bencher,只需将导入语句从:

use criterion::{criterion_group, criterion_main, Bencher, Criterion};

改为:

use codspeed_bencher_compat::{criterion_group, criterion_main, Bencher, Criterion};

其余代码可以保持不变。

完整示例demo

下面是一个完整的项目示例,展示如何使用codspeed-bencher-compat进行性能测试:

  1. 首先创建项目并添加依赖:
cargo new benchmark-demo
cd benchmark-demo
  1. 编辑Cargo.toml文件:
[package]
name = "benchmark-demo"
version = "0.1.0"
edition = "2021"

[dev-dependencies]
codspeed-bencher-compat = "0.1"
criterion = "0.4"
  1. 创建基准测试文件benches/benchmark.rs:
use codspeed_bencher_compat::{criterion_group, criterion_main, Bencher, Criterion};

// 一个简单的字符串处理函数
fn process_string(input: &str) -> String {
    input.chars().rev().collect::<String>().to_uppercase()
}

// 基准测试:处理短字符串
fn bench_short_string(b: &mut Bencher) {
    b.iter(|| process_string("hello"));
}

// 基准测试:处理长字符串
fn bench_long_string(b: &mut Bencher) {
    b.iter(|| process_string("this is a much longer string for benchmarking"));
}

// 配置基准测试组
fn criterion_benchmark(c: &mut Criterion) {
    c.bench_function("short string", bench_short_string);
    c.bench_function("long string", bench_long_string);
    
    // 也可以使用参数化基准测试
    let inputs = ["apple", "banana", "cherry"];
    c.bench_function_over_inputs(
        "fruit processing",
        |b, &&s| b.iter(|| process_string(s)),
        &inputs,
    );
}

// 定义测试组和主函数
criterion_group!(
    name = benches;
    config = Criterion::default().sample_size(10);
    targets = criterion_benchmark
);
criterion_main!(benches);
  1. 运行基准测试:
# 使用原生Criterion运行
cargo bench

# 使用CodSpeed运行
cargo install codspeed-cargo
cargo codspeed bench

这个完整示例展示了:

  • 如何设置基准测试项目
  • 如何编写基准测试函数
  • 如何使用不同的输入进行测试
  • 如何配置基准测试参数
  • 如何在Criterion和CodSpeed之间切换
回到顶部