shadow_rs/utility/
perf_timer.rs1use std::sync::atomic::{Ordering, compiler_fence};
2use std::time::{Duration, Instant};
3
4pub struct PerfTimer {
6    start_time: Option<Instant>,
7    elapsed: Duration,
8}
9
10impl PerfTimer {
11    pub fn new_started() -> Self {
13        Self {
14            start_time: Some(Instant::now()),
15            elapsed: Duration::new(0, 0),
16        }
17    }
18
19    pub fn new_stopped() -> Self {
21        Self {
22            start_time: None,
23            elapsed: Duration::new(0, 0),
24        }
25    }
26
27    pub fn start(&mut self) {
29        compiler_fence(Ordering::SeqCst);
30        debug_assert!(self.start_time.is_none());
31        self.start_time = Some(Instant::now());
32        compiler_fence(Ordering::SeqCst);
33    }
34
35    pub fn stop(&mut self) {
37        compiler_fence(Ordering::SeqCst);
38        debug_assert!(self.start_time.is_some());
39        if let Some(t) = self.start_time.take() {
40            self.elapsed += Instant::now().duration_since(t)
41        }
42        compiler_fence(Ordering::SeqCst);
43    }
44
45    pub fn elapsed(&self) -> Duration {
47        let mut e = self.elapsed;
48        if let Some(t) = self.start_time.as_ref() {
49            e += Instant::now().duration_since(*t)
50        }
51        e
52    }
53}
54
55impl Default for PerfTimer {
56    fn default() -> Self {
57        Self::new_started()
58    }
59}