You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何用Divan对同一函数在不同Feature下做基准测试?

在Rust中针对Feature状态分别做基准测试

当然可以实现同一函数在Feature启用/禁用状态下的基准测试,不管用Divan还是其他工具(比如Criterion.rs),核心思路都是编译不同Feature配置的二进制文件,分别运行基准测试。以下是具体实现方法:

用Divan实现的步骤

1. 配置Cargo.toml

先把依赖和Feature定义好:

[package]
name = "bench-feature-demo"
version = "0.1.0"
edition = "2021"

[dependencies]
rayon = { version = "1.7", optional = true }

[dev-dependencies]
divan = "0.1.10"

[features]
parallel = ["dep:rayon"]

2. 编写基准测试代码

基于你提供的代码调整,确保逻辑在不同Feature下正常工作:

use divan::counter::ItemsCount;
use divan::{black_box, Bencher};

fn main() {
    divan::main()
}

#[cfg(feature = "parallel")]
use rayon::iter::ParallelIterator;

fn compute_foo(size: usize) -> usize {
    #[cfg(feature = "parallel")]
    {
        (0..size).into_par_iter()
    }
    #[cfg(not(feature = "parallel"))]
    { (0..size).into_iter() }.map(|i| i * 123 / 4).sum()
}

#[divan::bench(args = [16, 32, 64, 128, 256, 512, 1024, 2048, 4096])]
fn bench_compute_foo(bencher: Bencher, size: usize) {
    bencher
        .input_counter(|| ItemsCount::new(size))
        .bench_refs(|| black_box(compute_foo(size)));
}

3. 分别运行基准测试

  • 禁用parallel Feature时:
cargo divan --no-default-features
  • 启用parallel Feature时:
cargo divan --features parallel

可以把两次的输出结果保存下来,直接对比性能差异。

用Criterion.rs实现的备选方案

如果你想换用更主流的基准测试工具,Criterion.rs的实现逻辑类似:

1. 配置Cargo.toml

[package]
name = "bench-feature-demo"
version = "0.1.0"
edition = "2021"

[dependencies]
rayon = { version = "1.7", optional = true }

[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }

[features]
parallel = ["dep:rayon"]

2. 编写基准测试代码

use criterion::{criterion_group, criterion_main, Criterion};
use rayon::iter::ParallelIterator;

fn compute_foo(size: usize) -> usize {
    #[cfg(feature = "parallel")]
    {
        (0..size).into_par_iter()
    }
    #[cfg(not(feature = "parallel"))]
    { (0..size).into_iter() }.map(|i| i * 123 / 4).sum()
}

fn bench_compute_foo(c: &mut Criterion) {
    let test_sizes = [16, 32, 64, 128, 256, 512, 1024, 2048, 4096];
    for &size in &test_sizes {
        c.bench_function(&format!("compute_foo/{}", size), |b| {
            b.iter(|| compute_foo(size))
        });
    }
}

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

3. 运行测试

  • 禁用Feature:
cargo bench --no-default-features
  • 启用Feature:
cargo bench --features parallel

Criterion会生成HTML报告,方便直观对比两次测试的性能数据。

内容的提问来源于stack exchange,提问作者Netwave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:15:56