Skip to content

Commit b1d2b8a

Browse files
committed
add mutex benches vs std + parking_lot
Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com>
1 parent 0c2282f commit b1d2b8a

File tree

2 files changed

+116
-30
lines changed

2 files changed

+116
-30
lines changed

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ crossbeam-deque = { version = "0.7.1", optional = true }
5959
crossbeam-utils = { version = "0.6.6", optional = true }
6060
futures-core = { version = "0.3.0", optional = true }
6161
futures-io = { version = "0.3.0", optional = true }
62-
futures-timer = { version = "1.0.2", optional = true }
62+
futures-timer = { version = "2.0.0", optional = true }
6363
kv-log-macro = { version = "1.0.4", optional = true }
6464
log = { version = "0.4.8", features = ["kv_unstable"], optional = true }
6565
memchr = { version = "2.2.1", optional = true }
@@ -73,10 +73,11 @@ slab = { version = "0.4.2", optional = true }
7373

7474
[dev-dependencies]
7575
femme = "1.2.0"
76+
futures = "0.3.0"
77+
parking_lot = "0.9.0"
7678
rand = "0.7.2"
7779
surf = "1.0.3"
7880
tempdir = "0.3.7"
79-
futures = "0.3.0"
8081

8182
[[test]]
8283
name = "stream"

benches/mutex.rs

Lines changed: 113 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,125 @@
11
#![feature(test)]
22

3-
extern crate test;
3+
mod async_std {
4+
extern crate test;
45

5-
use async_std::sync::{Arc, Mutex};
6-
use async_std::task;
7-
use test::Bencher;
6+
use async_std::sync::{Arc, Mutex};
7+
use async_std::task;
8+
use test::Bencher;
89

9-
#[bench]
10-
fn create(b: &mut Bencher) {
11-
b.iter(|| Mutex::new(()));
12-
}
10+
#[bench]
11+
fn create(b: &mut Bencher) {
12+
b.iter(|| Mutex::new(()));
13+
}
1314

14-
#[bench]
15-
fn contention(b: &mut Bencher) {
16-
b.iter(|| task::block_on(run(10, 1000)));
17-
}
15+
#[bench]
16+
fn contention(b: &mut Bencher) {
17+
b.iter(|| task::block_on(run(10, 1000)));
18+
}
19+
20+
#[bench]
21+
fn no_contention(b: &mut Bencher) {
22+
b.iter(|| task::block_on(run(1, 10000)));
23+
}
24+
25+
async fn run(task: usize, iter: usize) {
26+
let m = Arc::new(Mutex::new(()));
27+
let mut tasks = Vec::new();
28+
29+
for _ in 0..task {
30+
let m = m.clone();
31+
tasks.push(task::spawn(async move {
32+
for _ in 0..iter {
33+
let _ = m.lock().await;
34+
}
35+
}));
36+
}
1837

19-
#[bench]
20-
fn no_contention(b: &mut Bencher) {
21-
b.iter(|| task::block_on(run(1, 10000)));
38+
for t in tasks {
39+
t.await;
40+
}
41+
}
2242
}
2343

24-
async fn run(task: usize, iter: usize) {
25-
let m = Arc::new(Mutex::new(()));
26-
let mut tasks = Vec::new();
44+
mod std {
45+
extern crate test;
46+
47+
use std::sync::{Arc, Mutex};
48+
use std::thread;
49+
use test::Bencher;
2750

28-
for _ in 0..task {
29-
let m = m.clone();
30-
tasks.push(task::spawn(async move {
31-
for _ in 0..iter {
32-
let _ = m.lock().await;
33-
}
34-
}));
51+
#[bench]
52+
fn create(b: &mut Bencher) {
53+
b.iter(|| Mutex::new(()));
3554
}
3655

37-
for t in tasks {
38-
t.await;
56+
#[bench]
57+
fn contention(b: &mut Bencher) {
58+
b.iter(|| run(10, 1000));
3959
}
40-
}
60+
61+
#[bench]
62+
fn no_contention(b: &mut Bencher) {
63+
b.iter(|| run(1, 10000));
64+
}
65+
66+
fn run(thread: usize, iter: usize) {
67+
let m = Arc::new(Mutex::new(()));
68+
let mut threads = Vec::new();
69+
70+
for _ in 0..thread {
71+
let m = m.clone();
72+
threads.push(thread::spawn(move || {
73+
for _ in 0..iter {
74+
let _ = m.lock().unwrap();
75+
}
76+
}));
77+
}
78+
79+
for t in threads {
80+
t.join().unwrap();
81+
}
82+
}
83+
}
84+
85+
mod parking_lot {
86+
extern crate test;
87+
88+
use std::sync::Arc;
89+
use parking_lot::Mutex;
90+
use std::thread;
91+
use test::Bencher;
92+
93+
#[bench]
94+
fn create(b: &mut Bencher) {
95+
b.iter(|| Mutex::new(()));
96+
}
97+
98+
#[bench]
99+
fn contention(b: &mut Bencher) {
100+
b.iter(|| run(10, 1000));
101+
}
102+
103+
#[bench]
104+
fn no_contention(b: &mut Bencher) {
105+
b.iter(|| run(1, 10000));
106+
}
107+
108+
fn run(thread: usize, iter: usize) {
109+
let m = Arc::new(Mutex::new(()));
110+
let mut threads = Vec::new();
111+
112+
for _ in 0..thread {
113+
let m = m.clone();
114+
threads.push(thread::spawn(move || {
115+
for _ in 0..iter {
116+
let _ = m.lock();
117+
}
118+
}));
119+
}
120+
121+
for t in threads {
122+
t.join().unwrap();
123+
}
124+
}
125+
}

0 commit comments

Comments
 (0)