Skip to content

Commit 7850ad2

Browse files
committed
Use criterion for benchmark
1 parent b5b0655 commit 7850ad2

File tree

4 files changed

+251
-168
lines changed

4 files changed

+251
-168
lines changed

Cargo.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ equivalent = { version = "1.0", optional = true, default-features = false }
3737
lazy_static = "1.4"
3838
rand = { version = "0.9.0", features = ["small_rng"] }
3939
rayon = "1.2"
40+
criterion = "0.5"
4041
fnv = "1.0.7"
4142
serde_test = "1.0"
4243
doc-comment = "0.3.1"
@@ -78,3 +79,15 @@ inline-more = []
7879
[package.metadata.docs.rs]
7980
features = ["nightly", "rayon", "serde", "raw-entry"]
8081
rustdoc-args = ["--generate-link-to-definition"]
82+
83+
[[bench]]
84+
name = "bench"
85+
harness = false
86+
87+
[[bench]]
88+
name = "insert_unique_unchecked"
89+
harness = false
90+
91+
[[bench]]
92+
name = "set_ops"
93+
harness = false

benches/bench.rs

Lines changed: 150 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,8 @@
22
// Hasher: std default (SipHash) and crate default (foldhash).
33
// Int key distribution: low bit heavy, top bit heavy, and random.
44
// Task: basic functionality: insert, insert_erase, lookup, lookup_fail, iter
5-
#![feature(test)]
6-
7-
extern crate test;
8-
9-
use test::{black_box, Bencher};
105

6+
use criterion::{black_box, criterion_group, criterion_main, Criterion};
117
use hashbrown::DefaultHashBuilder;
128
use hashbrown::{HashMap, HashSet};
139
use std::{
@@ -78,15 +74,16 @@ macro_rules! bench_suite {
7874

7975
macro_rules! bench_insert {
8076
($name:ident, $maptype:ident, $keydist:expr) => {
81-
#[bench]
82-
fn $name(b: &mut Bencher) {
77+
fn $name(c: &mut Criterion) {
8378
let mut m = $maptype::with_capacity_and_hasher(SIZE, Default::default());
84-
b.iter(|| {
85-
m.clear();
86-
for i in ($keydist).take(SIZE) {
87-
m.insert(i, (DropType(i), [i; 20]));
88-
}
89-
black_box(&mut m);
79+
c.bench_function(stringify!($name), |b| {
80+
b.iter(|| {
81+
m.clear();
82+
for i in ($keydist).take(SIZE) {
83+
m.insert(i, (DropType(i), [i; 20]));
84+
}
85+
black_box(&mut m);
86+
});
9087
});
9188
eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst));
9289
}
@@ -105,15 +102,16 @@ bench_suite!(
105102

106103
macro_rules! bench_grow_insert {
107104
($name:ident, $maptype:ident, $keydist:expr) => {
108-
#[bench]
109-
fn $name(b: &mut Bencher) {
110-
b.iter(|| {
111-
let mut m = $maptype::default();
112-
for i in ($keydist).take(SIZE) {
113-
m.insert(i, DropType(i));
114-
}
115-
black_box(&mut m);
116-
})
105+
fn $name(c: &mut Criterion) {
106+
c.bench_function(stringify!($name), |b| {
107+
b.iter(|| {
108+
let mut m = $maptype::default();
109+
for i in ($keydist).take(SIZE) {
110+
m.insert(i, DropType(i));
111+
}
112+
black_box(&mut m);
113+
});
114+
});
117115
}
118116
};
119117
}
@@ -130,24 +128,25 @@ bench_suite!(
130128

131129
macro_rules! bench_insert_erase {
132130
($name:ident, $maptype:ident, $keydist:expr) => {
133-
#[bench]
134-
fn $name(b: &mut Bencher) {
131+
fn $name(c: &mut Criterion) {
135132
let mut base = $maptype::default();
136133
for i in ($keydist).take(SIZE) {
137134
base.insert(i, DropType(i));
138135
}
139136
let skip = $keydist.skip(SIZE);
140-
b.iter(|| {
141-
let mut m = base.clone();
142-
let mut add_iter = skip.clone();
143-
let mut remove_iter = $keydist;
144-
// While keeping the size constant,
145-
// replace the first keydist with the second.
146-
for (add, remove) in (&mut add_iter).zip(&mut remove_iter).take(SIZE) {
147-
m.insert(add, DropType(add));
148-
black_box(m.remove(&remove));
149-
}
150-
black_box(m);
137+
c.bench_function(stringify!($name), |b| {
138+
b.iter(|| {
139+
let mut m = base.clone();
140+
let mut add_iter = skip.clone();
141+
let mut remove_iter = $keydist;
142+
// While keeping the size constant,
143+
// replace the first keydist with the second.
144+
for (add, remove) in (&mut add_iter).zip(&mut remove_iter).take(SIZE) {
145+
m.insert(add, DropType(add));
146+
black_box(m.remove(&remove));
147+
}
148+
black_box(m);
149+
});
151150
});
152151
eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst));
153152
}
@@ -166,17 +165,18 @@ bench_suite!(
166165

167166
macro_rules! bench_lookup {
168167
($name:ident, $maptype:ident, $keydist:expr) => {
169-
#[bench]
170-
fn $name(b: &mut Bencher) {
168+
fn $name(c: &mut Criterion) {
171169
let mut m = $maptype::default();
172170
for i in $keydist.take(SIZE) {
173171
m.insert(i, DropType(i));
174172
}
175173

176-
b.iter(|| {
177-
for i in $keydist.take(SIZE) {
178-
black_box(m.get(&i));
179-
}
174+
c.bench_function(stringify!($name), |b| {
175+
b.iter(|| {
176+
for i in $keydist.take(SIZE) {
177+
black_box(m.get(&i));
178+
}
179+
});
180180
});
181181
eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst));
182182
}
@@ -195,19 +195,20 @@ bench_suite!(
195195

196196
macro_rules! bench_lookup_fail {
197197
($name:ident, $maptype:ident, $keydist:expr) => {
198-
#[bench]
199-
fn $name(b: &mut Bencher) {
198+
fn $name(c: &mut Criterion) {
200199
let mut m = $maptype::default();
201200
let mut iter = $keydist;
202201
for i in (&mut iter).take(SIZE) {
203202
m.insert(i, DropType(i));
204203
}
205204

206-
b.iter(|| {
207-
for i in (&mut iter).take(SIZE) {
208-
black_box(m.get(&i));
209-
}
210-
})
205+
c.bench_function(stringify!($name), |b| {
206+
b.iter(|| {
207+
for i in (&mut iter).take(SIZE) {
208+
black_box(m.get(&i));
209+
}
210+
});
211+
});
211212
}
212213
};
213214
}
@@ -224,18 +225,19 @@ bench_suite!(
224225

225226
macro_rules! bench_iter {
226227
($name:ident, $maptype:ident, $keydist:expr) => {
227-
#[bench]
228-
fn $name(b: &mut Bencher) {
228+
fn $name(c: &mut Criterion) {
229229
let mut m = $maptype::default();
230230
for i in ($keydist).take(SIZE) {
231231
m.insert(i, DropType(i));
232232
}
233233

234-
b.iter(|| {
235-
for i in &m {
236-
black_box(i);
237-
}
238-
})
234+
c.bench_function(stringify!($name), |b| {
235+
b.iter(|| {
236+
for i in &m {
237+
black_box(i);
238+
}
239+
});
240+
});
239241
}
240242
};
241243
}
@@ -250,80 +252,132 @@ bench_suite!(
250252
iter_std_random
251253
);
252254

253-
#[bench]
254-
fn clone_small(b: &mut Bencher) {
255+
fn clone_small(c: &mut Criterion) {
255256
let mut m = HashMap::new();
256257
for i in 0..10 {
257258
m.insert(i, DropType(i));
258259
}
259260

260-
b.iter(|| {
261-
black_box(m.clone());
262-
})
261+
c.bench_function("clone_small", |b| {
262+
b.iter(|| {
263+
black_box(m.clone());
264+
});
265+
});
263266
}
264267

265-
#[bench]
266-
fn clone_from_small(b: &mut Bencher) {
268+
fn clone_from_small(c: &mut Criterion) {
267269
let mut m = HashMap::new();
268270
let mut m2 = HashMap::new();
269271
for i in 0..10 {
270272
m.insert(i, DropType(i));
271273
}
272274

273-
b.iter(|| {
274-
m2.clone_from(&m);
275-
black_box(&mut m2);
276-
})
275+
c.bench_function("clone_from_small", |b| {
276+
b.iter(|| {
277+
m2.clone_from(&m);
278+
black_box(&mut m2);
279+
});
280+
});
277281
}
278282

279-
#[bench]
280-
fn clone_large(b: &mut Bencher) {
283+
fn clone_large(c: &mut Criterion) {
281284
let mut m = HashMap::new();
282285
for i in 0..1000 {
283286
m.insert(i, DropType(i));
284287
}
285288

286-
b.iter(|| {
287-
black_box(m.clone());
288-
})
289+
c.bench_function("clone_large", |b| {
290+
b.iter(|| {
291+
black_box(m.clone());
292+
});
293+
});
289294
}
290295

291-
#[bench]
292-
fn clone_from_large(b: &mut Bencher) {
296+
fn clone_from_large(c: &mut Criterion) {
293297
let mut m = HashMap::new();
294298
let mut m2 = HashMap::new();
295299
for i in 0..1000 {
296300
m.insert(i, DropType(i));
297301
}
298302

299-
b.iter(|| {
300-
m2.clone_from(&m);
301-
black_box(&mut m2);
302-
})
303+
c.bench_function("clone_from_large", |b| {
304+
b.iter(|| {
305+
m2.clone_from(&m);
306+
black_box(&mut m2);
307+
});
308+
});
303309
}
304310

305-
#[bench]
306-
fn rehash_in_place(b: &mut Bencher) {
307-
b.iter(|| {
308-
let mut set = HashSet::new();
311+
fn rehash_in_place(c: &mut Criterion) {
312+
c.bench_function("rehash_in_place", |b| {
313+
b.iter(|| {
314+
let mut set = HashSet::new();
309315

310-
// Each loop triggers one rehash
311-
for _ in 0..10 {
312-
for i in 0..223 {
313-
set.insert(i);
314-
}
316+
// Each loop triggers one rehash
317+
for _ in 0..10 {
318+
for i in 0..223 {
319+
set.insert(i);
320+
}
315321

316-
assert_eq!(
317-
set.capacity(),
318-
224,
319-
"The set must be at or close to capacity to trigger a re hashing"
320-
);
322+
assert_eq!(
323+
set.capacity(),
324+
224,
325+
"The set must be at or close to capacity to trigger a rehashing"
326+
);
321327

322-
for i in 100..1400 {
323-
set.remove(&(i - 100));
324-
set.insert(i);
328+
for i in 100..1400 {
329+
set.remove(&(i - 100));
330+
set.insert(i);
331+
}
332+
set.clear();
325333
}
326-
set.clear();
327-
}
334+
});
328335
});
329336
}
337+
338+
criterion_group!(
339+
benches,
340+
insert_foldhash_serial,
341+
insert_std_serial,
342+
insert_foldhash_highbits,
343+
insert_std_highbits,
344+
insert_foldhash_random,
345+
insert_std_random,
346+
grow_insert_foldhash_serial,
347+
grow_insert_std_serial,
348+
grow_insert_foldhash_highbits,
349+
grow_insert_std_highbits,
350+
grow_insert_foldhash_random,
351+
grow_insert_std_random,
352+
insert_erase_foldhash_serial,
353+
insert_erase_std_serial,
354+
insert_erase_foldhash_highbits,
355+
insert_erase_std_highbits,
356+
insert_erase_foldhash_random,
357+
insert_erase_std_random,
358+
lookup_foldhash_serial,
359+
lookup_std_serial,
360+
lookup_foldhash_highbits,
361+
lookup_std_highbits,
362+
lookup_foldhash_random,
363+
lookup_std_random,
364+
lookup_fail_foldhash_serial,
365+
lookup_fail_std_serial,
366+
lookup_fail_foldhash_highbits,
367+
lookup_fail_std_highbits,
368+
lookup_fail_foldhash_random,
369+
lookup_fail_std_random,
370+
iter_foldhash_serial,
371+
iter_std_serial,
372+
iter_foldhash_highbits,
373+
iter_std_highbits,
374+
iter_foldhash_random,
375+
iter_std_random,
376+
clone_small,
377+
clone_from_small,
378+
clone_large,
379+
clone_from_large,
380+
rehash_in_place
381+
);
382+
383+
criterion_main!(benches);

0 commit comments

Comments
 (0)