use std::io::{self, Write}; use std::time::{Duration, Instant}; /// RAII timer to measure how long phases take. #[derive(Debug)] pub struct Timer<'a> { output: bool, name: &'a str, start: Instant, } impl<'a> Timer<'a> { /// Creates a Timer with the given name, and starts it. By default, /// will print to stderr when it is `drop`'d pub fn new(name: &'a str) -> Self { Timer { output: true, name, start: Instant::now(), } } /// Sets whether or not the Timer will print a message /// when it is dropped. pub fn with_output(mut self, output: bool) -> Self { self.output = output; self } /// Returns the time elapsed since the timer's creation pub fn elapsed(&self) -> Duration { self.start.elapsed() } fn print_elapsed(&mut self) { if self.output { let elapsed = self.elapsed(); let time = (elapsed.as_secs() as f64) * 1e3 + f64::from(elapsed.subsec_nanos()) / 1e6; let stderr = io::stderr(); // Arbitrary output format, subject to change. writeln!(stderr.lock(), " time: {time:>9.3} ms.\t{}", self.name) .expect("timer write should not fail"); } } } impl Drop for Timer<'_> { fn drop(&mut self) { self.print_elapsed(); } }