extern crate basic_dsp;
extern crate docopt;
extern crate rand;
use basic_dsp::*;
use docopt::Docopt;
use rand::prelude::*;
use std::collections::HashMap;
use std::env;
const INIT_VAL_RANGE: (f64, f64) = (-100.0, 100.0);
const USAGE: &'static str = "
Benchmarks various functions over different daza sizes and prints the results to STDOUT in
a table format. Results can be piped to `plot_csv_data.py` to produce a plot.
Usage: bench_tables [--limit=<size>]
bench_tables (--help)
Options:
-h, --help Display usage.
--limit=<size> Data sizes tested will not exceed this value. [default: 0]
";
fn bench_real<F: FnMut(RealTimeVec64)>(
name: &'static str,
data: &Vec<f64>,
results: &mut HashMap<&'static str, Vec<u128>>,
mut func: F,
) {
let mut dsp = data.clone().to_real_time_vec();
let mut settings = dsp.get_multicore_settings().clone();
settings.core_limit = 1;
dsp.set_multicore_settings(settings);
let start = std::time::Instant::now();
func(dsp);
let duration = start.elapsed();
results
.entry(name)
.or_insert(Vec::new())
.push(duration.as_nanos());
}
fn create_pseudo_random_data(data_set_size: usize, seed: usize) -> Vec<f64> {
let mut vec: Vec<f64> = vec![0.0; data_set_size];
let mut rng: StdRng = SeedableRng::seed_from_u64(seed as u64);
for n in &mut vec {
*n = rng.gen_range(INIT_VAL_RANGE.0, INIT_VAL_RANGE.1);
}
vec
}
fn main() {
let argv = env::args();
let args = Docopt::new(USAGE)
.and_then(|d| d.argv(argv.into_iter()).parse())
.unwrap_or_else(|e| e.exit());
if args.get_bool("-h") || args.get_bool("--help") {
println!("{}", USAGE);
std::process::exit(0);
}
let limit_arg = args.get_str("--limit");
let limit = if limit_arg != "" {
match limit_arg.trim().parse::<usize>().ok() {
Some(l) => l,
_ => {
println!("{}", USAGE);
std::process::exit(1);
}
}
} else {
0
};
let mut results: HashMap<&'static str, Vec<u128>, _> = HashMap::new();
let data_sizes: Vec<usize> = vec![
1000, 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000, 200000,
500000, 1000000, 5000000, 100000000,
];
let data_sizes: Vec<usize> = data_sizes
.into_iter()
.take_while(|x| limit == 0 || *x <= limit)
.collect();
for data_set_size in &data_sizes {
let original = create_pseudo_random_data(*data_set_size, 5798734);
bench_real("Approx", &original, &mut results, |mut v| {
v.log_approx(10.0)
});
bench_real("Accurate", &original, &mut results, |mut v| v.log(10.0));
}
print!("Sizes, ");
for value in &data_sizes {
print!("{:?}, ", value);
}
println!("");
let mut sorted: Vec<_> = results.keys().map(|x| (*x)).collect();
sorted.sort();
for key in &sorted {
print!("{:?} [ns], ", key);
for value in &results[key] {
print!("{:?}, ", value);
}
println!("");
}
}