Bencher Compatibility Layer

Criterion.rs provides a small crate which can be used as a drop-in replacement for most common usages of bencher in order to make it easy for existing bencher users to try out Criterion.rs. This page shows an example of how to use this crate.

Example

We'll start with the example benchmark from bencher:


#![allow(unused)]
fn main() {
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);
}

The first step is to edit the Cargo.toml file to replace the bencher dependency with criterion_bencher_compat:

Change:

[dev-dependencies]
bencher = "0.1"

To:

[dev-dependencies]
criterion_bencher_compat = "0.3"

Then we update the benchmark file itself to change:


#![allow(unused)]
fn main() {
use bencher::{benchmark_group, benchmark_main, Bencher};
}

To:


#![allow(unused)]
fn main() {
use criterion_bencher_compat as bencher;
use bencher::{benchmark_group, benchmark_main, Bencher};
}

That's all! Now just run cargo bench:

     Running target/release/deps/bencher_example-d865087781455bd5
a                       time:   [234.58 ps 237.68 ps 241.94 ps]
Found 9 outliers among 100 measurements (9.00%)
  4 (4.00%) high mild
  5 (5.00%) high severe

b                       time:   [23.972 ns 24.218 ns 24.474 ns]
Found 4 outliers among 100 measurements (4.00%)
  4 (4.00%) high mild

Limitations

criterion_bencher_compat does not implement the full API of the bencher crate, only the most commonly-used subset. If your benchmarks require parts of the bencher crate which are not supported, you may need to temporarily disable them while trying Criterion.rs.

criterion_bencher_compat does not provide access to most of Criterion.rs' more advanced features. If the Criterion.rs benchmarks work well for you, it is recommended to convert your benchmarks to use the Criterion.rs interface directly. See Migrating from libtest for more information on that.