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 { Instant::now() - self.start } fn print_elapsed(&mut self) { if self.output { let elapsed = self.elapsed(); let time = (elapsed.as_secs() as f64) * 1e3 + (elapsed.subsec_nanos() as f64) / 1e6; let stderr = io::stderr(); // Arbitrary output format, subject to change. writeln!(stderr.lock(), " time: {:>9.3} ms.\t{}", time, self.name) .expect("timer write should not fail"); } } } impl<'a> Drop for Timer<'a> { fn drop(&mut self) { self.print_elapsed(); } }