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 pool = rayon::ThreadPoolBuilder::new().num_threads(available).build().unwrap(); pool.broadcast(|_| { black_box(7usize); }); println!("install {:?}", measure(|| { black_box(install_empty(black_box(&pool))); }, 10000)); println!("in_place_scope_no_spawn {:?}", measure(|| { black_box(pool.in_place_scope(|_| black_box(7usize))); }, 10000)); println!("in_place_scope_one_spawn {:?}", measure(|| { pool.in_place_scope(|s| { s.spawn(|_| { black_box(7usize); }); }); }, 10000)); }