#[cfg(not(target_arch = "wasm32"))] use test::{Bencher, black_box}; macro_rules! bench_instant_threaded { ($bench_name:ident, $thread_count:expr) => { #[bench] #[cfg(not(target_arch = "wasm32"))] fn $bench_name(b: &mut Bencher) -> std::thread::Result<()> { use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Instant; let running = Arc::new(AtomicBool::new(true)); let threads: Vec<_> = (0..$thread_count) .map(|_| { let flag = Arc::clone(&running); std::thread::spawn(move || { while flag.load(Ordering::Relaxed) { black_box(Instant::now()); } }) }) .collect(); b.iter(|| { let a = Instant::now(); let b = Instant::now(); assert!(b >= a); }); running.store(false, Ordering::Relaxed); for t in threads { t.join()?; } Ok(()) } }; } bench_instant_threaded!(instant_contention_01_threads, 0); bench_instant_threaded!(instant_contention_02_threads, 1); bench_instant_threaded!(instant_contention_04_threads, 3); bench_instant_threaded!(instant_contention_08_threads, 7); bench_instant_threaded!(instant_contention_16_threads, 15);