use std::collections::BTreeMap;
use std::sync::{Mutex, OnceLock};
use std::time::Instant;
static ACC: Mutex<BTreeMap<&'static str, u128>> = Mutex::new(BTreeMap::new());
pub(crate) fn enabled() -> bool {
static ON: OnceLock<bool> = OnceLock::new();
*ON.get_or_init(|| std::env::var_os("PDFMUSE_PROFILE").is_some())
}
pub(crate) fn accum(on: bool, key: &'static str, t: &Option<Instant>) {
if let Some(t) = t.filter(|_| on) {
*ACC.lock().unwrap().entry(key).or_insert(0) += t.elapsed().as_nanos();
}
}
pub(crate) fn dump(on: bool) {
if on {
let mut m = ACC.lock().unwrap();
for (k, v) in m.iter() {
eprintln!("[prof] {k:44} {:>9.2} ms", *v as f64 / 1e6);
}
m.clear();
}
}
pub(crate) fn start(on: bool) -> Option<Instant> {
on.then(Instant::now)
}
pub(crate) fn log(t: &Option<Instant>, stage: &str) {
if let Some(t) = t {
eprintln!("[prof] {stage:46} {:>9.2} ms", t.elapsed().as_secs_f64() * 1000.0);
}
}