use std::{hint::black_box, time::Instant}; fn measure(mut f: impl FnMut(), iters: usize) -> (f64, f64, f64) { for _ in 0..1000 { f(); } let mut samples = Vec::new(); for _ in 0..15 { let start = Instant::now(); for _ in 0..iters { f(); } samples.push(start.elapsed().as_secs_f64() * 1e6 / iters as f64); } samples.sort_by(f64::total_cmp); (samples[7], samples[0], samples[14]) } #[inline(never)] fn install_empty(pool: &rayon::ThreadPool) -> usize { pool.install(|| black_box(7usize)) } fn main() { let available = std::thread::available_parallelism().unwrap().get(); println!("available_parallelism={available}; 15 batches x 10000 calls; us/call median [min,max]"); println!("direct {:?}", measure(|| { black_box(black_box(7usize)); }, 10000)); let mut counts = vec![1, 2, 8, available]; counts.sort(); counts.dedup(); for n in counts { let pool = rayon::ThreadPoolBuilder::new().num_threads(n).build().unwrap(); pool.broadcast(|_| { black_box(7usize); }); let outside = measure(|| { black_box(install_empty(black_box(&pool))); }, 10000); let inside = pool.install(|| measure(|| { black_box(install_empty(black_box(&pool))); }, 10000)); println!("threads={n} outside={outside:?} inside={inside:?}"); } }