Skip to main content

proofman_util/
timer_macro.rs

1#[macro_export]
2macro_rules! timer_start_info {
3    ($name:ident) => {
4        #[allow(non_snake_case)]
5        let $name = std::time::Instant::now();
6        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
7        let escape_in = match is_terminal {
8            true => "\x1b[2m",
9            false => "",
10        };
11        let escape_out = match is_terminal {
12            true => "\x1b[37;0m",
13            false => "",
14        };
15        tracing::info!("{}>>> {}{}", escape_in, stringify!($name), escape_out);
16    };
17    ($name:ident, $($arg:tt)+) => {
18        #[allow(non_snake_case)]
19        let $name = std::time::Instant::now();
20        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
21        let escape_in = match is_terminal {
22            true => "\x1b[2m",
23            false => "",
24        };
25        let escape_out = match is_terminal {
26            true => "\x1b[37;0m",
27            false => "",
28        };
29        tracing::info!("{}>>> {}{}", escape_in, format!($($arg)+), escape_out);
30    };
31}
32
33#[macro_export]
34macro_rules! timer_stop_and_log_info {
35    ($name:ident) => {
36        #[allow(non_snake_case)]
37        let $name = std::time::Instant::now() - $name;
38        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
39        let escape_in = match is_terminal {
40            true => "\x1b[2m",
41            false => "",
42        };
43        let escape_out = match is_terminal {
44            true => "\x1b[37;0m",
45            false => "",
46        };
47        tracing::info!("{}<<< {} ({}ms){}", escape_in, stringify!($name), $name.as_millis(), escape_out);
48    };
49    ($name:ident, $($arg:tt)+) => {
50        #[allow(non_snake_case)]
51        let $name = std::time::Instant::now() - $name;
52        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
53        let escape_in = match is_terminal {
54            true => "\x1b[2m",
55            false => "",
56        };
57        let escape_out = match is_terminal {
58            true => "\x1b[37;0m",
59            false => "",
60        };
61        tracing::info!("{}<<< {} ({}ms){}", escape_in, format!($($arg)+), $name.as_millis(), escape_out);
62    };
63}
64
65#[macro_export]
66macro_rules! timer_start_debug {
67    ($name:ident) => {
68        #[allow(non_snake_case)]
69        let $name = std::time::Instant::now();
70        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
71        let escape_in = match is_terminal {
72            true => "\x1b[2m",
73            false => "",
74        };
75        let escape_out = match is_terminal {
76            true => "\x1b[37;0m",
77            false => "",
78        };
79        tracing::debug!("{}>>> {}{}", escape_in, stringify!($name), escape_out);
80    };
81    ($name:ident, $($arg:tt)+) => {
82        #[allow(non_snake_case)]
83        let $name = std::time::Instant::now();
84        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
85        let escape_in = match is_terminal {
86            true => "\x1b[2m",
87            false => "",
88        };
89        let escape_out = match is_terminal {
90            true => "\x1b[37;0m",
91            false => "",
92        };
93        tracing::debug!("{}>>> {}{}", escape_in, format!($($arg)+), escape_out);
94    };
95}
96
97#[macro_export]
98macro_rules! timer_stop_and_log_debug {
99    ($name:ident) => {
100        #[allow(non_snake_case)]
101        let $name = std::time::Instant::now() - $name;
102        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
103        let escape_in = match is_terminal {
104            true => "\x1b[2m",
105            false => "",
106        };
107        let escape_out = match is_terminal {
108            true => "\x1b[37;0m",
109            false => "",
110        };
111        tracing::debug!("{}<<< {} ({}ms){}", escape_in, stringify!($name), $name.as_millis(), escape_out);
112    };
113    ($name:ident, $($arg:tt)+) => {
114        #[allow(non_snake_case)]
115        let $name = std::time::Instant::now() - $name;
116        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
117        let escape_in = match is_terminal {
118            true => "\x1b[2m",
119            false => "",
120        };
121        let escape_out = match is_terminal {
122            true => "\x1b[37;0m",
123            false => "",
124        };
125        tracing::debug!("{}<<< {} ({}ms){}", escape_in, format!($($arg)+), $name.as_millis(), escape_out);
126    };
127}
128
129#[macro_export]
130macro_rules! timer_start_trace {
131    ($name:ident) => {
132        #[allow(non_snake_case)]
133        let $name = std::time::Instant::now();
134        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
135        let escape_in = match is_terminal {
136            true => "\x1b[2m",
137            false => "",
138        };
139        let escape_out = match is_terminal {
140            true => "\x1b[37;0m",
141            false => "",
142        };
143        tracing::trace!("{}>>> {}{}", escape_in, stringify!($name), escape_out);
144    };
145    ($name:ident, $($arg:tt)+) => {
146        #[allow(non_snake_case)]
147        let $name = std::time::Instant::now();
148        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
149        let escape_in = match is_terminal {
150            true => "\x1b[2m",
151            false => "",
152        };
153        let escape_out = match is_terminal {
154            true => "\x1b[37;0m",
155            false => "",
156        };
157        tracing::trace!("{}>>> {}{}", escape_in, format!($($arg)+), escape_out);
158    };
159}
160
161#[macro_export]
162macro_rules! timer_stop_and_log_trace {
163    ($name:ident) => {
164        #[allow(non_snake_case)]
165        let $name = std::time::Instant::now() - $name;
166        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
167        let escape_in = match is_terminal {
168            true => "\x1b[2m",
169            false => "",
170        };
171        let escape_out = match is_terminal {
172            true => "\x1b[37;0m",
173            false => "",
174        };
175        tracing::trace!("{}<<< {} ({}ms){}", escape_in, stringify!($name), $name.as_millis(), escape_out);
176    };
177    ($name:ident, $($arg:tt)+) => {
178        #[allow(non_snake_case)]
179        let $name = std::time::Instant::now() - $name;
180        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
181        let escape_in = match is_terminal {
182            true => "\x1b[2m",
183            false => "",
184        };
185        let escape_out = match is_terminal {
186            true => "\x1b[37;0m",
187            false => "",
188        };
189        tracing::trace!("{}<<< {} ({}ms){}", escape_in, format!($($arg)+), $name.as_millis(), escape_out);
190    };
191}
192
193/// Like [`timer_stop_and_log_debug`] but subtracts a known blocked interval, so the logged span is
194/// the work itself. `$waited` is a `Duration`; it is reported alongside rather than dropped.
195#[macro_export]
196macro_rules! timer_stop_and_log_debug_net {
197    ($name:ident, $waited:expr, $($arg:tt)+) => {
198        #[allow(non_snake_case)]
199        let $name = std::time::Instant::now() - $name;
200        let waited: std::time::Duration = $waited;
201        let net = $name.saturating_sub(waited);
202        let is_terminal = std::io::IsTerminal::is_terminal(&std::io::stdout()) && std::env::var("NO_COLOR").is_err();
203        let escape_in = match is_terminal {
204            true => "\x1b[2m",
205            false => "",
206        };
207        let escape_out = match is_terminal {
208            true => "\x1b[37;0m",
209            false => "",
210        };
211        tracing::debug!(
212            "{}<<< {} ({}ms) [waited {}ms]{}",
213            escape_in,
214            format!($($arg)+),
215            net.as_millis(),
216            waited.as_millis(),
217            escape_out
218        );
219    };
220}