use std::cell::RefCell;
thread_local! {
static TIMING: RefCell<Vec<(&'static str, std::time::Duration)>> = const { RefCell::new(Vec::new())};
}
fn take_timings() -> Vec<(&'static str, std::time::Duration)> {
TIMING.with(|timings| std::mem::take(&mut *timings.borrow_mut()))
}
fn print_timings() {
let timings = take_timings();
for (name, duration) in timings {
debug!("{}: {:?}", name, duration);
}
}
pub(crate) fn save_timing(name: &'static str, duration: std::time::Duration) {
TIMING.with(|timings| {
timings.borrow_mut().push((name, duration));
});
let is_root = matches!(
name,
"munch"
| "proxy"
| "spit"
| "derive_spit"
| "derive_snif"
| "derive_snif_attr"
| "snif"
| "vanish"
);
if is_root && crate::PRINT_TIMINGS {
print_timings();
}
}
macro_rules! timed {
($name: literal, $block: block) => {{
let start = std::time::Instant::now();
let result = $block;
let duration = start.elapsed();
$crate::timings::save_timing($name, duration);
result
}};
}