use std::time::Duration; pub fn pct(sorted: &mut [Duration], p: f64) -> f64 { if sorted.is_empty() { return 0.0; } sorted.sort_unstable(); let i = ((sorted.len() as f64 - 1.0) * p).round() as usize; sorted[i].as_secs_f64() * 1000.0 } pub const CPU_BUDGET: Duration = Duration::from_micros(8_333); pub fn summarise(name: &str, samples: &[Duration]) { let mut v = samples.to_vec(); let over_budget = v.iter().filter(|d| **d > CPU_BUDGET).count(); println!( " {name:16} n={:<5} p50 {:.2}ms p90 {:.2}ms p99 {:.2}ms worst {:.2}ms \ over-8.3ms {over_budget}", v.len(), pct(&mut v, 0.5), pct(&mut v, 0.9), pct(&mut v, 0.99), pct(&mut v, 1.0), ); } pub fn pct_u64(v: &mut [u64], p: f64) -> u64 { if v.is_empty() { return 0; } v.sort_unstable(); v[(((v.len() - 1) as f64) * p).round() as usize] }