use std::collections::HashMap;
use std::sync::{Arc, LazyLock, Mutex, PoisonError};
static ENABLED: LazyLock<bool> =
LazyLock::new(|| std::env::var_os("NUVEC_PROFILE").is_some_and(|v| v != "0"));
type Table = HashMap<Arc<str>, (u64, f64)>;
static TABLE: Mutex<Option<Table>> = Mutex::new(None);
pub fn enabled() -> bool {
*ENABLED
}
pub(crate) fn shapes() -> bool {
static SHAPES: LazyLock<bool> =
LazyLock::new(|| std::env::var_os("NUVEC_PROFILE").is_some_and(|v| v == "shapes"));
*SHAPES
}
pub(crate) fn record(kernels: &[Arc<str>], seconds: f64) {
if kernels.is_empty() {
return;
}
let share = seconds / kernels.len() as f64;
let mut table = TABLE.lock().unwrap_or_else(PoisonError::into_inner);
let table = table.get_or_insert_with(HashMap::new);
for k in kernels {
let entry = table.entry(k.clone()).or_default();
entry.0 += 1;
entry.1 += share;
}
}
pub fn report() -> Vec<(String, u64, f64)> {
let table = TABLE.lock().unwrap_or_else(PoisonError::into_inner);
let mut rows: Vec<_> = table
.iter()
.flatten()
.map(|(k, &(n, s))| (k.to_string(), n, s))
.collect();
rows.sort_by(|a, b| b.2.total_cmp(&a.2));
rows
}
pub fn reset() {
*TABLE.lock().unwrap_or_else(PoisonError::into_inner) = None;
}