bitbazaar/timing/
mod.rs

1mod macros;
2mod recorder;
3
4/// Format a duration in a human readable format.
5pub fn format_duration(duration: std::time::Duration) -> String {
6    let time_unit;
7    let time_value;
8
9    let elapsed_s = duration.as_secs() as u128;
10    if elapsed_s >= 1 {
11        time_unit = "s";
12        time_value = elapsed_s;
13    } else {
14        let elapsed_ms = duration.as_millis();
15        if elapsed_ms >= 1 {
16            time_unit = "ms";
17            time_value = elapsed_ms;
18        } else {
19            let elapsed_us = duration.as_micros();
20            if elapsed_us >= 1 {
21                time_unit = "μs";
22                time_value = elapsed_us;
23            } else {
24                let elapsed_ns = duration.as_nanos();
25                time_unit = "ns";
26                time_value = elapsed_ns;
27            }
28        }
29    }
30
31    format!("{}{}", time_value, time_unit)
32}
33
34pub use recorder::{TimeRecorder, GLOBAL_TIME_RECORDER};
35
36#[cfg(test)]
37mod tests {
38    use std::time::Duration;
39
40    use rstest::*;
41
42    use super::*;
43    use crate::timeit;
44
45    #[rstest]
46    #[case(Duration::from_millis(1), "1ms")]
47    #[case(Duration::from_micros(1), "1μs")]
48    #[case(Duration::from_nanos(1), "1ns")]
49    #[case(Duration::from_millis(999), "999ms")]
50    #[case(Duration::from_millis(1000), "1s")]
51    fn test_format_duration(#[case] input: Duration, #[case] expected: String) {
52        assert_eq!(expected, format_duration(input));
53    }
54
55    #[rstest]
56    fn test_recorder() {
57        let recorder = TimeRecorder::new();
58
59        recorder.timeit("test", || {
60            std::thread::sleep(Duration::from_millis(1));
61        });
62
63        let elapsed = recorder.total_elapsed().unwrap();
64        assert!(
65            // Such a fallible test in CI, making very relaxed:
66            elapsed.as_millis() > 0 && elapsed.as_millis() < 5,
67            "elapsed: {:?}",
68            elapsed.as_millis()
69        );
70
71        let formatted = recorder.format_verbose().unwrap();
72        assert!(formatted.contains("test"));
73    }
74
75    #[rstest]
76    fn test_global() {
77        timeit!("test", {
78            std::thread::sleep(Duration::from_millis(1));
79        });
80        let elapsed = GLOBAL_TIME_RECORDER.total_elapsed().unwrap();
81        assert!(
82            // Such a fallible test in CI, making very relaxed:
83            elapsed.as_millis() > 0 && elapsed.as_millis() < 5,
84            "elapsed: {:?}",
85            elapsed.as_millis()
86        );
87    }
88}