diff options
Diffstat (limited to 'src/macros.rs')
-rwxr-xr-x | src/macros.rs | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/macros.rs b/src/macros.rs new file mode 100755 index 0000000..ca8bb5c --- /dev/null +++ b/src/macros.rs @@ -0,0 +1,132 @@ +//! Contains macros which together define a benchmark harness that can be used +//! in place of the standard benchmark harness. This allows the user to run +//! Criterion.rs benchmarks with `cargo bench`. + +/// Macro used to define a function group for the benchmark harness; see the +/// `criterion_main!` macro for more details. +/// +/// This is used to define a function group; a collection of functions to call with a common +/// Criterion configuration. Accepts two forms which can be seen below. +/// +/// Note that the group name given here is not important, it must simply +/// be unique. Note also that this macro is not related to the `Criterion::benchmark_group` function +/// or the `BenchmarkGroup` type. +/// +/// # Examples: +/// +/// Complete form: +/// +/// ``` +/// # #[macro_use] +/// # extern crate criterion; +/// # use criterion::Criterion; +/// # fn bench_method1(c: &mut Criterion) { +/// # } +/// # +/// # fn bench_method2(c: &mut Criterion) { +/// # } +/// # +/// criterion_group!{ +/// name = benches; +/// config = Criterion::default(); +/// targets = bench_method1, bench_method2 +/// } +/// # +/// # fn main() {} +/// ``` +/// +/// In this form, all of the options are clearly spelled out. This expands to +/// a function named benches, which uses the given config expression to create +/// an instance of the Criterion struct. This is then passed by mutable +/// reference to the targets. +/// +/// Compact Form: +/// +/// ``` +/// # #[macro_use] +/// # extern crate criterion; +/// # use criterion::Criterion; +/// # fn bench_method1(c: &mut Criterion) { +/// # } +/// # +/// # fn bench_method2(c: &mut Criterion) { +/// # } +/// # +/// criterion_group!(benches, bench_method1, bench_method2); +/// # +/// # fn main() {} +/// ``` +/// In this form, the first parameter is the name of the group and subsequent +/// parameters are the target methods. The Criterion struct will be created using +/// the `Criterion::default()` function. If you wish to customize the +/// configuration, use the complete form and provide your own configuration +/// function. +#[macro_export] +macro_rules! criterion_group { + (name = $name:ident; config = $config:expr; targets = $( $target:path ),+ $(,)*) => { + pub fn $name() { + let mut criterion: $crate::Criterion<_> = $config + .configure_from_args(); + $( + $target(&mut criterion); + )+ + } + }; + ($name:ident, $( $target:path ),+ $(,)*) => { + criterion_group!{ + name = $name; + config = $crate::Criterion::default(); + targets = $( $target ),+ + } + } +} + +/// Macro which expands to a benchmark harness. +/// +/// Currently, using Criterion.rs requires disabling the benchmark harness +/// generated automatically by rustc. This can be done like so: +/// +/// ```toml +/// [[bench]] +/// name = "my_bench" +/// harness = false +/// ``` +/// +/// In this case, `my_bench` must be a rust file inside the 'benches' directory, +/// like so: +/// +/// `benches/my_bench.rs` +/// +/// Since we've disabled the default benchmark harness, we need to add our own: +/// +/// ```ignore +/// #[macro_use] +/// extern crate criterion; +/// use criterion::Criterion; +/// fn bench_method1(c: &mut Criterion) { +/// } +/// +/// fn bench_method2(c: &mut Criterion) { +/// } +/// +/// criterion_group!(benches, bench_method1, bench_method2); +/// criterion_main!(benches); +/// ``` +/// +/// The `criterion_main` macro expands to a `main` function which runs all of the +/// benchmarks in the given groups. +/// +#[macro_export] +macro_rules! criterion_main { + ( $( $group:path ),+ $(,)* ) => { + fn main() { + $( + $group(); + )+ + + $crate::Criterion::default() + .configure_from_args() + .final_summary(); + } + } +} |