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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use std::time::Instant; pub struct Timer { times: Vec<(String, f64)>, current_instant: Option<Instant>, current_name: Option<String>, } impl Timer { pub fn new() -> Self { Timer { times: Vec::new(), current_instant: None, current_name: None, } } pub fn start<S: Into<String>>(&mut self, name: S) { if let Some(instant) = self.current_instant.take() { if let Some(name) = self.current_name.take() { let elapsed = instant.elapsed(); let ms = (elapsed.as_secs() as f64 * 1000.0) + (elapsed.subsec_nanos() as f64 / 1000000.0); self.times.push((name, ms)); } } self.current_name = Some(name.into()); self.current_instant = Some(Instant::now()); } pub fn stop(&mut self) { if let Some(instant) = self.current_instant.take() { if let Some(name) = self.current_name.take() { let elapsed = instant.elapsed(); let ms = (elapsed.as_secs() as f64 * 1000.0) + (elapsed.subsec_nanos() as f64 / 1000000.0); self.times.push((name, ms)); } } } pub fn display(&self) -> String { let mut out = String::new(); for &(ref name, ref ms) in &self.times { out.push_str(format!("{}: {:.3} ms, ", name, ms).as_str()); } out.pop(); out.pop(); out } pub fn display_micros(&self) -> String { let mut out = String::new(); for &(ref name, ref ms) in &self.times { out.push_str(format!("{}: {:.3} µs, ", name, ms * 1000.0).as_str()); } out.pop(); out.pop(); out } }