1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
use std::time::{Instant, Duration}; pub trait Timing { fn elapsed_us(&self) -> u64; fn elapsed_ms(&self) -> u64; } impl Timing { pub fn start() -> Instant { Instant::now() } } impl Timing for Duration { fn elapsed_us(&self) -> u64 { self.as_secs() as u64 * 1_000_000 + self.subsec_nanos() as u64 / 1_000 } fn elapsed_ms(&self) -> u64 { self.as_secs() as u64 * 1_000 + self.subsec_nanos() as u64 / 1_000_000 } } impl Timing for Instant { fn elapsed_us(&self) -> u64 { self.elapsed().elapsed_us() } fn elapsed_ms(&self) -> u64 { self.elapsed().elapsed_ms() } } #[test] fn test_conversions() { let d = Duration::new(54, 321_987_600); assert_eq!(d.elapsed_us(), 54_321_987); assert_eq!(d.elapsed_ms(), 54_321); }