extern crate cast; #[macro_use] extern crate criterion; extern crate criterion_stats as stats; extern crate rand; mod common_bench; macro_rules! stat { ($ty:ident <- $($stat:ident),+) => { $( fn $stat(c: &mut Criterion) { let v = ::common_bench::vec::<$ty>(); c.bench_function( &format!("stat_{}_{}", stringify!($ty), stringify!($stat)), move |b| { let s = ::stats::univariate::Sample::new(&v); b.iter(|| s.$stat()) }); } )+ } } macro_rules! stat_none { ($ty:ident <- $($stat:ident),+) => { $( fn $stat(c: &mut Criterion) { let v = ::common_bench::vec::<$ty>(); c.bench_function( &format!("stat_none_{}_{}", stringify!($ty), stringify!($stat)), move |b| { let s = ::stats::univariate::Sample::new(&v); b.iter(|| s.$stat(None)) }); } )+ } } macro_rules! fast_stat { ($ty:ident <- $(($stat:ident, $aux_stat:ident)),+) => { $( fn $stat(c: &mut Criterion) { let v = ::common_bench::vec::<$ty>(); c.bench_function( &format!("fast_stat_{}_{}", stringify!($ty), stringify!($stat)), move |b| { let s = ::stats::univariate::Sample::new(&v); let aux = Some(s.$aux_stat()); b.iter(|| s.$stat(aux)) }); } )+ } } macro_rules! bench { ($ty:ident) => { pub mod $ty { pub trait SampleExt { fn base_percentiles(&self) -> ::stats::univariate::Percentiles<$ty> where usize: ::cast::From<$ty, Output = Result>; fn iqr(&self) -> $ty where usize: ::cast::From<$ty, Output = Result>, { self.base_percentiles().iqr() } fn median(&self) -> $ty where usize: ::cast::From<$ty, Output = Result>, { self.base_percentiles().median() } } impl SampleExt for ::stats::univariate::Sample<$ty> { fn base_percentiles(&self) -> ::stats::univariate::Percentiles<$ty> where usize: ::cast::From<$ty, Output = Result>, { self.percentiles() } } use criterion::Criterion; stat!( $ty <- iqr, max, mean, median, median_abs_dev_pct, min, std_dev_pct, sum ); stat_none!($ty <- median_abs_dev, std_dev, var); criterion_group! { name = benches; config = Criterion::default(); targets = iqr, max, mean, median, median_abs_dev_pct, min, std_dev_pct, sum, median_abs_dev, std_dev, var } pub mod fast { use super::SampleExt; use criterion::Criterion; fast_stat!( $ty <- (median_abs_dev, median), (std_dev, mean), (var, mean) ); criterion_group! { name = benches; config = Criterion::default(); targets = median_abs_dev, std_dev, var } } } }; } bench!(f64); criterion_main!(f64::benches, f64::fast::benches);