testudo/src/timer.rs
src/timer.rsRaw
1#[cfg(feature = "profile")]
2use colored::Colorize;
3#[cfg(feature = "profile")]
4use core::sync::atomic::AtomicUsize;
5#[cfg(feature = "profile")]
6use core::sync::atomic::Ordering;
7#[cfg(feature = "profile")]
8use std::time::Instant;
9
10#[cfg(feature = "profile")]
11pub static CALL_DEPTH: AtomicUsize = AtomicUsize::new(0);
12
13#[cfg(feature = "profile")]
14pub struct Timer {
15 label: String,
16 timer: Instant,
17}
18
19#[cfg(feature = "profile")]
20impl Timer {
21 #[inline(always)]
22 pub fn new(label: &str) -> Self {
23 let timer = Instant::now();
24 CALL_DEPTH.fetch_add(1, Ordering::Relaxed);
25 let star = "* ";
26 println!(
27 "{:indent$}{}{}",
28 "",
29 star,
30 label.yellow().bold(),
31 indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed)
32 );
33 Self {
34 label: label.to_string(),
35 timer,
36 }
37 }
38
39 #[inline(always)]
40 pub fn stop(&self) {
41 let duration = self.timer.elapsed();
42 let star = "* ";
43 println!(
44 "{:indent$}{}{} {:?}",
45 "",
46 star,
47 self.label.blue().bold(),
48 duration,
49 indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed)
50 );
51 CALL_DEPTH.fetch_sub(1, Ordering::Relaxed);
52 }
53
54 #[inline(always)]
55 pub fn print(msg: &str) {
56 CALL_DEPTH.fetch_add(1, Ordering::Relaxed);
57 let star = "* ";
58 println!(
59 "{:indent$}{}{}",
60 "",
61 star,
62 msg.to_string().green().bold(),
63 indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed)
64 );
65 CALL_DEPTH.fetch_sub(1, Ordering::Relaxed);
66 }
67}
68
69#[cfg(not(feature = "profile"))]
70pub struct Timer {
71 _label: String,
72}
73
74#[cfg(not(feature = "profile"))]
75impl Timer {
76 #[inline(always)]
77 pub fn new(label: &str) -> Self {
78 Self {
79 _label: label.to_string(),
80 }
81 }
82
83 #[inline(always)]
84 pub fn stop(&self) {}
85
86 #[inline(always)]
87 pub fn print(_msg: &str) {}
88}