Skip to content

Commit 1dd0478

Browse files
committed
Mutex performance benchmarks
Signed-off-by: Gary Guo <gary@garyguo.net>
1 parent ec23632 commit 1dd0478

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

benches/mutex.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#![feature(test)]
2+
3+
extern crate test;
4+
5+
use async_std::future::Future;
6+
use async_std::sync::{Arc, Mutex};
7+
use async_std::task;
8+
use futures::task::noop_waker;
9+
use test::Bencher;
10+
11+
async fn test(task: usize, iter: usize) {
12+
let mutex = Arc::new(Mutex::new(()));
13+
let mut vec = Vec::new();
14+
for _ in 0..task {
15+
let mutex_clone = mutex.clone();
16+
let handle = async_std::task::spawn(async move {
17+
for _ in 0..iter {
18+
let _ = mutex_clone.lock().await;
19+
}
20+
});
21+
vec.push(handle);
22+
}
23+
for i in vec {
24+
i.await
25+
}
26+
}
27+
28+
#[bench]
29+
fn mutex_contention(b: &mut Bencher) {
30+
b.iter(|| task::block_on(test(10, 1000)));
31+
}
32+
33+
#[bench]
34+
fn mutex_no_contention(b: &mut Bencher) {
35+
b.iter(|| task::block_on(test(1, 10000)));
36+
}
37+
38+
#[bench]
39+
fn mutex_unused(b: &mut Bencher) {
40+
b.iter(|| Mutex::new(()));
41+
}
42+
43+
#[bench]
44+
fn mutex_mimick_contention(b: &mut Bencher) {
45+
let noop_waker = noop_waker();
46+
let mut context = task::Context::from_waker(&noop_waker);
47+
48+
b.iter(|| {
49+
let mutex = Mutex::new(());
50+
let mut vec = Vec::with_capacity(10);
51+
52+
// Mimick 10 tasks concurrently trying to acquire the lock.
53+
for _ in 0..10 {
54+
let mut lock_future = Box::pin(mutex.lock());
55+
let poll_result = lock_future.as_mut().poll(&mut context);
56+
vec.push((lock_future, poll_result));
57+
}
58+
59+
// Go through all 10 tasks and release the lock.
60+
for (mut future, mut poll) in vec {
61+
while let task::Poll::Pending = poll {
62+
poll = future.as_mut().poll(&mut context);
63+
}
64+
}
65+
});
66+
}

0 commit comments

Comments
 (0)