swc_timer/
lib.rs

1#[doc(hidden)]
2pub extern crate tracing;
3
4use tracing::{info, span::EnteredSpan};
5
6/// Prints time elapsed since `start` when dropped.
7///
8/// See [timer] for usages.
9pub 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    /// Don't use this directly. Use [timer] instead.
18    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/// Creates a timer. For input arguments, see [tracing::span].
37///
38/// # Convention
39///
40/// The string passed to `timer!` should start with a verb.
41///
42/// # Example usage
43///
44/// ```
45/// use swc_timer::timer;
46/// # let _logger = testing::init();
47/// let _timer = timer!("");
48/// ```
49///
50/// ## With arguments
51/// ```
52/// use swc_timer::timer;
53/// # let _logger = testing::init();
54/// let arg = "path";
55/// let _timer = timer!("bundle", path = arg);
56/// ```
57#[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}