fret-perf 0.1.0

Lightweight perf instrumentation helpers that unify per-frame stats and tracing spans.
Documentation
use fret_core::time::Instant;
use std::time::Duration;

#[inline]
pub fn measure<T>(enabled: bool, f: impl FnOnce() -> T) -> (T, Option<Duration>) {
    if !enabled {
        return (f(), None);
    }
    let started = Instant::now();
    let out = f();
    (out, Some(started.elapsed()))
}

#[inline]
pub fn measure_span<T>(
    time_enabled: bool,
    span_enabled: bool,
    make_span: impl FnOnce() -> tracing::Span,
    f: impl FnOnce() -> T,
) -> (T, Option<Duration>) {
    if !time_enabled && !span_enabled {
        return (f(), None);
    }

    let started = time_enabled.then(Instant::now);
    let span = span_enabled
        .then(make_span)
        .unwrap_or_else(tracing::Span::none);
    let _guard = span.enter();
    let out = f();
    (out, started.map(|s| s.elapsed()))
}

#[inline]
pub fn measure_span_with<T>(
    time_enabled: bool,
    span_enabled: bool,
    make_span: impl FnOnce() -> tracing::Span,
    f: impl FnOnce(&tracing::Span) -> T,
) -> (T, Option<Duration>) {
    if !time_enabled && !span_enabled {
        return (f(&tracing::Span::none()), None);
    }

    let started = time_enabled.then(Instant::now);
    let span = span_enabled
        .then(make_span)
        .unwrap_or_else(tracing::Span::none);
    let _guard = span.enter();
    let out = f(&span);
    (out, started.map(|s| s.elapsed()))
}