1#[doc(hidden)]
2pub extern crate tracing;
3
4use tracing::{info, span::EnteredSpan};
5
6pub struct Timer {
10 #[cfg(not(target_arch = "wasm32"))]
11 _span: EnteredSpan,
12 #[cfg(not(target_arch = "wasm32"))]
13 start: std::time::Instant,
14}
15
16impl Timer {
17 pub fn new(_span: EnteredSpan) -> Self {
19 Self {
20 #[cfg(not(target_arch = "wasm32"))]
21 _span,
22 #[cfg(not(target_arch = "wasm32"))]
23 start: std::time::Instant::now(),
24 }
25 }
26}
27
28#[cfg(not(target_arch = "wasm32"))]
29impl Drop for Timer {
30 fn drop(&mut self) {
31 let dur = self.start.elapsed();
32 info!(kind = "perf", "Done in {:?}", dur);
33 }
34}
35
36#[macro_export]
58macro_rules! timer {
59 ($($args:tt)*) => {{
60 #[cfg(not(target_arch = "wasm32"))]
61 let span = $crate::tracing::span!($crate::tracing::Level::INFO, $($args)*).entered();
62
63 #[cfg(not(target_arch = "wasm32"))]
64 $crate::Timer::new(span)
65 }};
66}