1use std::io::{self, Write};
2use std::time::{Duration, Instant};
3
4#[derive(Debug)]
6pub struct Timer<'a> {
7 output: bool,
8 name: &'a str,
9 start: Instant,
10}
11
12impl<'a> Timer<'a> {
13 pub fn new(name: &'a str) -> Self {
16 Timer {
17 output: true,
18 name,
19 start: Instant::now(),
20 }
21 }
22
23 pub fn with_output(mut self, output: bool) -> Self {
26 self.output = output;
27 self
28 }
29
30 pub fn elapsed(&self) -> Duration {
32 Instant::now() - self.start
33 }
34
35 fn print_elapsed(&mut self) {
36 if self.output {
37 let elapsed = self.elapsed();
38 let time = (elapsed.as_secs() as f64) * 1e3 +
39 f64::from(elapsed.subsec_nanos()) / 1e6;
40 let stderr = io::stderr();
41 writeln!(stderr.lock(), " time: {time:>9.3} ms.\t{}", self.name)
43 .expect("timer write should not fail");
44 }
45 }
46}
47
48impl Drop for Timer<'_> {
49 fn drop(&mut self) {
50 self.print_elapsed();
51 }
52}