#![feature(test)] extern crate test; use async_std::sync::{Arc, Mutex}; use async_std::task; use test::Bencher; #[bench] fn create(b: &mut Bencher) { b.iter(|| Mutex::new(())); } #[bench] fn contention(b: &mut Bencher) { b.iter(|| task::block_on(run(10, 1000))); } #[bench] fn no_contention(b: &mut Bencher) { b.iter(|| task::block_on(run(1, 10000))); } async fn run(task: usize, iter: usize) { let m = Arc::new(Mutex::new(())); let mut tasks = Vec::new(); for _ in 0..task { let m = m.clone(); tasks.push(task::spawn(async move { for _ in 0..iter { let _ = m.lock().await; } })); } for t in tasks { t.await; } }