use std::cell::RefCell;
use std::time::Instant;
thread_local! {
static TOTALS: RefCell<Vec<(&'static str, f64, u64)>> = const { RefCell::new(Vec::new()) };
}
pub fn time<T>(name: &'static str, f: impl FnOnce() -> T) -> T {
let t = Instant::now();
let r = f();
let ms = t.elapsed().as_secs_f64() * 1e3;
TOTALS.with(|v| {
let mut v = v.borrow_mut();
match v.iter_mut().find(|e| e.0 == name) {
Some(e) => {
e.1 += ms;
e.2 += 1;
}
None => v.push((name, ms, 1)),
}
});
r
}
pub fn take() -> Vec<(&'static str, f64, u64)> {
TOTALS.with(|v| std::mem::take(&mut *v.borrow_mut()))
}
pub fn since(name: &'static str, t: Instant) {
time(name, || ());
TOTALS.with(|v| {
if let Some(e) = v.borrow_mut().iter_mut().find(|e| e.0 == name) {
e.1 += t.elapsed().as_secs_f64() * 1e3;
}
});
}