use solana_sdk::timing::duration_as_ns; use std::time::Instant; pub struct Measure { start: Instant, duration: u64, } impl Measure { pub fn start(_name: &'static str) -> Self { Self { start: Instant::now(), duration: 0, } } pub fn stop(&mut self) { self.duration = duration_as_ns(&self.start.elapsed()); } pub fn as_us(&self) -> u64 { self.duration / 1000 } pub fn as_ms(&self) -> u64 { self.duration / (1000 * 1000) } pub fn as_s(&self) -> f32 { self.duration as f32 / (1000.0f32 * 1000.0f32 * 1000.0f32) } } #[cfg(test)] mod tests { use super::*; use std::thread::sleep; use std::time::Duration; #[test] fn test_measure() { let mut measure = Measure::start("test"); sleep(Duration::from_secs(1)); measure.stop(); assert!(measure.as_s() >= 0.99f32 && measure.as_s() <= 1.01f32); assert!(measure.as_ms() >= 990 && measure.as_ms() <= 1_010); assert!(measure.as_us() >= 999_000 && measure.as_us() <= 1_010_000); } }