//! Opt-in phase timings (`OXY_TIMINGS=1`): each named phase prints its //! duration to stderr, for measuring where a command spends its time //! without a profiler. use std::sync::OnceLock; use std::time::Instant; fn enabled() -> bool { static ON: OnceLock = OnceLock::new(); *ON.get_or_init(|| std::env::var_os("OXY_TIMINGS").is_some_and(|v| !v.is_empty() && v != "0")) } /// Report a duration measured by hand (several intervals summed), if timings are on. pub fn record(name: &str, d: std::time::Duration) { if enabled() { eprintln!("timing {:<28} {:>9.2} ms", name, d.as_secs_f64() * 1000.0); } } /// Prints `timing ` when dropped, if timings are on. pub struct Phase { name: &'static str, started: Option, } /// Start timing a phase; the guard reports when it goes out of scope. pub fn phase(name: &'static str) -> Phase { Phase { name, started: enabled().then(Instant::now), } } impl Drop for Phase { fn drop(&mut self) { if let Some(t) = self.started { eprintln!( "timing {:<28} {:>9.2} ms", self.name, t.elapsed().as_secs_f64() * 1000.0 ); } } }