//! Probe: what do jouleclaw-energy's meters report on this box? The host meter //! (`detect_meter`, for work wherever it runs) and the in-process meter //! (`detect_in_process_meter`, for work on this process's own threads — this //! probe's own CPU burn is such work). use jouleclaw_energy::meter::{detect_in_process_meter, detect_meter, CompositeMeter}; fn probe(label: &str, m: &CompositeMeter) { println!("{label}: active meter: {} (holds {:?})", m.active_name(), m.names()); println!("{label}: available: {}", m.is_available()); let r0 = m.read().expect("read0"); println!("{label}: provenance: {:?}, domain: {:?}", r0.provenance, r0.domain); // Burn some CPU on this thread so a counter shows a delta. let t = std::time::Instant::now(); let mut x = 0u64; for i in 0..3_000_000_000u64 { x = x.wrapping_add(i ^ (x >> 1)); } let r1 = m.read().expect("read1"); let secs = t.elapsed().as_secs_f64(); let dj = r1.uj.saturating_sub(r0.uj) as f64 / 1e6; println!("{label}: spin sentinel: {x}"); println!( "{label}: over {:.2}s: delta {:.3} J (~{:.1} W avg)", secs, dj, if secs > 0.0 { dj / secs } else { 0.0 } ); } fn main() { probe("host", &detect_meter()); probe("in-process", &detect_in_process_meter()); }