1234567891011121314151617181920212223242526272829303132333435363738use std::sync::atomic::{AtomicU8, Ordering};use std::time::Instant;
static ENABLED: AtomicU8 = AtomicU8::new(2);
pub fn enabled() -> bool { match ENABLED.load(Ordering::Relaxed) { 0 => false, 1 => true, _ => { let on = std::env::var("KNOT_PROFILE").is_ok_and(|v| v == "1"); ENABLED.store(if on { 1 } else { 0 }, Ordering::Relaxed); on } }}
pub struct Span { name: &'static str, start: Instant,}
impl Span { pub fn start(name: &'static str) -> Self { Self { name, start: Instant::now(), } }
pub fn end(self) { if enabled() { let ms = self.start.elapsed().as_secs_f64() * 1000.0; eprintln!("[profile] {:<28} {:>9.2} ms", self.name, ms); } }}