eframe/
stopwatch.rs

1#![allow(dead_code)] // not everything is used on wasm
2
3use web_time::Instant;
4
5pub struct Stopwatch {
6    total_time_ns: u128,
7
8    /// None = not running
9    start: Option<Instant>,
10}
11
12impl Stopwatch {
13    pub fn new() -> Self {
14        Self {
15            total_time_ns: 0,
16            start: None,
17        }
18    }
19
20    pub fn start(&mut self) {
21        assert!(self.start.is_none());
22        self.start = Some(Instant::now());
23    }
24
25    pub fn pause(&mut self) {
26        let start = self.start.take().unwrap();
27        let duration = start.elapsed();
28        self.total_time_ns += duration.as_nanos();
29    }
30
31    pub fn resume(&mut self) {
32        assert!(self.start.is_none());
33        self.start = Some(Instant::now());
34    }
35
36    pub fn total_time_ns(&self) -> u128 {
37        if let Some(start) = self.start {
38            // Running
39            let duration = start.elapsed();
40            self.total_time_ns + duration.as_nanos()
41        } else {
42            // Paused
43            self.total_time_ns
44        }
45    }
46
47    pub fn total_time_sec(&self) -> f32 {
48        self.total_time_ns() as f32 * 1e-9
49    }
50}