Skip to main content

fret_perf/
lib.rs

1use fret_core::time::Instant;
2use std::time::Duration;
3
4#[inline]
5pub fn measure<T>(enabled: bool, f: impl FnOnce() -> T) -> (T, Option<Duration>) {
6    if !enabled {
7        return (f(), None);
8    }
9    let started = Instant::now();
10    let out = f();
11    (out, Some(started.elapsed()))
12}
13
14#[inline]
15pub fn measure_span<T>(
16    time_enabled: bool,
17    span_enabled: bool,
18    make_span: impl FnOnce() -> tracing::Span,
19    f: impl FnOnce() -> T,
20) -> (T, Option<Duration>) {
21    if !time_enabled && !span_enabled {
22        return (f(), None);
23    }
24
25    let started = time_enabled.then(Instant::now);
26    let span = span_enabled
27        .then(make_span)
28        .unwrap_or_else(tracing::Span::none);
29    let _guard = span.enter();
30    let out = f();
31    (out, started.map(|s| s.elapsed()))
32}
33
34#[inline]
35pub fn measure_span_with<T>(
36    time_enabled: bool,
37    span_enabled: bool,
38    make_span: impl FnOnce() -> tracing::Span,
39    f: impl FnOnce(&tracing::Span) -> T,
40) -> (T, Option<Duration>) {
41    if !time_enabled && !span_enabled {
42        return (f(&tracing::Span::none()), None);
43    }
44
45    let started = time_enabled.then(Instant::now);
46    let span = span_enabled
47        .then(make_span)
48        .unwrap_or_else(tracing::Span::none);
49    let _guard = span.enter();
50    let out = f(&span);
51    (out, started.map(|s| s.elapsed()))
52}