use std::time::{SystemTime, SystemTimeError, Duration};
#[inline]
pub fn timer_all<F>(mut f: F, times: u32) -> Result<Duration, SystemTimeError>
where
F: FnMut(),
{
let st = SystemTime::now();
for _ in 0..times {
f();
}
SystemTime::now().duration_since(st)
}
#[inline]
pub fn timer_avg<F>(f: F, times: u32) -> Result<Duration, SystemTimeError>
where
F: FnMut(),
{
timer_all(f, times).map(|t| t / times)
}
#[macro_export]
macro_rules! timer_times {
($times_macro:expr, $times_fn:expr, $($fn_name: ident($($args: expr),*)),+) => {
for _ in 0..$times_macro {
$(println!("{}: {:?}",stringify!($fn_name), $crate::timer_avg(||$fn_name($($args),*), $times_fn).unwrap()); )+
println!();
}
}
}
#[macro_export]
macro_rules! timer_sort {
($times_macro:expr, $times_fn:expr, $($fn_name: tt($($args: expr),*)),+) => {
use std::time::Duration;
for _ in 0..$times_macro {
let mut vs:Vec<(&str, Duration)> =Vec::default();
$(vs.push((stringify!($fn_name),$crate::timer_all(||$fn_name($($args),*), $times_fn).unwrap()));)+
vs.sort_by(|&(_,ref a),&(_,ref b)| b.cmp(a));
let max_len= vs.as_slice().iter() .fold(0,| acc, &(s,_) | if s.len() > acc { s.len() } else { acc });
let blanks_fix= |msg: &str| {
let mut tmp =String::default();
for _ in 0..max_len- msg.len()
{tmp.push(' ');}
tmp
};
vs.iter().map(|&(fn_name,t)|
println!("{}{}: {:?}/{:?}",fn_name,blanks_fix(fn_name),t/$times_fn,t)
).count();
println!();
}
}
}
#[macro_export]
macro_rules! timer_avg_sort {
($times_macro:expr, $times_fn:expr, $($fn_name: tt($($args: expr),*)),+) => {
use std::time::Duration;
for _ in 0..$times_macro {
let mut vs:Vec<(&str, Duration)> =Vec::default();
$(vs.push((stringify!($fn_name),$crate::timer_avg(||$fn_name($($args),*), $times_fn).unwrap()));)+
vs.sort_by(|&(_,ref a),&(_,ref b)| b.cmp(a));
let max_len= vs.as_slice().iter() .fold(0,| acc, &(s,_) | if s.len() > acc { s.len() } else { acc });
let blanks_fix= |msg: &str| {
let mut tmp =String::default();
for _ in 0..max_len- msg.len()
{tmp.push(' ');}
tmp
};
vs.iter().map(|&(fn_name,t)|
println!("{}{}: {:?}",fn_name,blanks_fix(fn_name),t)
).count();
println!();
}
}
}
#[macro_export]
macro_rules! timer_all_sort {
($times_macro:expr, $times_fn:expr, $($fn_name: tt($($args: expr),*)),+) => {
use std::time::Duration;
for _ in 0..$times_macro {
let mut vs:Vec<(&str, Duration)> =Vec::default();
$(vs.push((stringify!($fn_name),$crate::timer_all(||$fn_name($($args),*), $times_fn).unwrap()));)+
vs.sort_by(|&(_,ref a),&(_,ref b)| b.cmp(a));
let max_len= vs.as_slice().iter() .fold(0,| acc, &(s,_) | if s.len() > acc { s.len() } else { acc });
let blanks_fix= |msg: &str| {
let mut tmp =String::default();
for _ in 0..max_len- msg.len()
{tmp.push(' ');}
tmp
};
vs.iter().map(|&(fn_name,t)|
println!("{}{}: {:?}",fn_name,blanks_fix(fn_name),t)
).count();
println!();
}
}
}