//! 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 ),+ $(,)*) => { $crate::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(); } } }