Skip to content

Commit 119f429

Browse files
committed
Auto merge of #84 - edre:bench, r=Amanieu
Update insert_erase benchmark to keep the table size constant. This should create a lot of tombstones and require periodic table rehashing. Also use more macros to reduce copy-paste duplication.
2 parents 143609d + 8783490 commit 119f429

File tree

1 file changed

+70
-104
lines changed

1 file changed

+70
-104
lines changed

benches/bench.rs

Lines changed: 70 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -22,49 +22,48 @@ type StdHashMap<K, V> = HashMap<K, V, RandomState>;
2222
// A random key iterator.
2323
#[derive(Clone, Copy)]
2424
struct RandomKeys {
25-
remaining: usize,
2625
state: usize,
2726
}
2827

2928
impl RandomKeys {
30-
fn new(size: usize) -> Self {
31-
RandomKeys {
32-
remaining: size,
33-
state: 1,
34-
}
35-
}
36-
37-
// Produce a different set of random values.
38-
fn new2(size: usize) -> Self {
39-
RandomKeys {
40-
remaining: size,
41-
state: 2,
42-
}
29+
fn new() -> Self {
30+
RandomKeys { state: 0 }
4331
}
4432
}
4533

4634
impl Iterator for RandomKeys {
4735
type Item = usize;
4836
fn next(&mut self) -> Option<usize> {
49-
if self.remaining == 0 {
50-
None
51-
} else {
52-
self.remaining -= 1;
53-
// Multiply by some 32 bit prime.
54-
self.state = self.state.wrapping_mul(3787392781);
55-
// Mix in to the bottom bits which are constant mod powers of 2.
56-
Some(self.state ^ (self.state >> 4))
57-
}
37+
// Add 1 then multiply by some 32 bit prime.
38+
self.state = self.state.wrapping_add(1).wrapping_mul(3787392781);
39+
Some(self.state)
5840
}
5941
}
6042

43+
macro_rules! bench_suite {
44+
($bench_macro:ident, $bench_fx_serial:ident, $bench_std_serial:ident,
45+
$bench_fx_highbits:ident, $bench_std_highbits:ident,
46+
$bench_fx_random:ident, $bench_std_random:ident) => {
47+
$bench_macro!($bench_fx_serial, FxHashMap, 0..);
48+
$bench_macro!($bench_std_serial, StdHashMap, 0..);
49+
$bench_macro!($bench_fx_highbits, FxHashMap, (0..).map(usize::swap_bytes));
50+
$bench_macro!(
51+
$bench_std_highbits,
52+
StdHashMap,
53+
(0..).map(usize::swap_bytes)
54+
);
55+
$bench_macro!($bench_fx_random, FxHashMap, RandomKeys::new());
56+
$bench_macro!($bench_std_random, StdHashMap, RandomKeys::new());
57+
};
58+
}
59+
6160
macro_rules! bench_insert {
6261
($name:ident, $maptype:ident, $keydist:expr) => {
6362
#[bench]
6463
fn $name(b: &mut Bencher) {
6564
b.iter(|| {
6665
let mut m = $maptype::default();
67-
for i in $keydist {
66+
for i in ($keydist).take(SIZE) {
6867
m.insert(i, i);
6968
}
7069
black_box(m);
@@ -73,139 +72,111 @@ macro_rules! bench_insert {
7372
};
7473
}
7574

76-
bench_insert!(insert_fx_serial, FxHashMap, 0..SIZE);
77-
bench_insert!(insert_std_serial, StdHashMap, 0..SIZE);
78-
bench_insert!(
75+
bench_suite!(
76+
bench_insert,
77+
insert_fx_serial,
78+
insert_std_serial,
7979
insert_fx_highbits,
80-
FxHashMap,
81-
(0..SIZE).map(usize::swap_bytes)
82-
);
83-
bench_insert!(
8480
insert_std_highbits,
85-
StdHashMap,
86-
(0..SIZE).map(usize::swap_bytes)
81+
insert_fx_random,
82+
insert_std_random
8783
);
88-
bench_insert!(insert_fx_random, FxHashMap, RandomKeys::new(SIZE));
89-
bench_insert!(insert_std_random, StdHashMap, RandomKeys::new(SIZE));
9084

9185
macro_rules! bench_insert_erase {
9286
($name:ident, $maptype:ident, $keydist:expr) => {
9387
#[bench]
9488
fn $name(b: &mut Bencher) {
89+
let mut m = $maptype::default();
90+
let mut add_iter = $keydist;
91+
for i in (&mut add_iter).take(SIZE) {
92+
m.insert(i, i);
93+
}
94+
let mut remove_iter = $keydist;
9595
b.iter(|| {
96-
let mut m = $maptype::default();
97-
for i in $keydist {
98-
m.insert(i, i);
99-
}
100-
black_box(&mut m);
101-
for i in $keydist {
102-
m.remove(&i);
96+
// While keeping the size constant,
97+
// replace the first keydist with the second.
98+
for (add, remove) in (&mut add_iter).zip(&mut remove_iter).take(SIZE) {
99+
m.insert(add, add);
100+
black_box(m.remove(&remove));
103101
}
104-
black_box(m);
105102
})
106103
}
107104
};
108105
}
109106

110-
bench_insert_erase!(insert_erase_fx_serial, FxHashMap, 0..SIZE);
111-
bench_insert_erase!(insert_erase_std_serial, StdHashMap, 0..SIZE);
112-
bench_insert_erase!(
107+
bench_suite!(
108+
bench_insert_erase,
109+
insert_erase_fx_serial,
110+
insert_erase_std_serial,
113111
insert_erase_fx_highbits,
114-
FxHashMap,
115-
(0..SIZE).map(usize::swap_bytes)
116-
);
117-
bench_insert_erase!(
118112
insert_erase_std_highbits,
119-
StdHashMap,
120-
(0..SIZE).map(usize::swap_bytes)
113+
insert_erase_fx_random,
114+
insert_erase_std_random
121115
);
122-
bench_insert_erase!(insert_erase_fx_random, FxHashMap, RandomKeys::new(SIZE));
123-
bench_insert_erase!(insert_erase_std_random, StdHashMap, RandomKeys::new(SIZE));
124116

125117
macro_rules! bench_lookup {
126118
($name:ident, $maptype:ident, $keydist:expr) => {
127119
#[bench]
128120
fn $name(b: &mut Bencher) {
129121
let mut m = $maptype::default();
130-
for i in $keydist {
122+
for i in $keydist.take(SIZE) {
131123
m.insert(i, i);
132124
}
133125

134126
b.iter(|| {
135-
for i in $keydist {
127+
for i in $keydist.take(SIZE) {
136128
black_box(m.get(&i));
137129
}
138130
})
139131
}
140132
};
141133
}
142134

143-
bench_lookup!(lookup_fx_serial, FxHashMap, 0..SIZE);
144-
bench_lookup!(lookup_std_serial, StdHashMap, 0..SIZE);
145-
bench_lookup!(
135+
bench_suite!(
136+
bench_lookup,
137+
lookup_fx_serial,
138+
lookup_std_serial,
146139
lookup_fx_highbits,
147-
FxHashMap,
148-
(0..SIZE).map(usize::swap_bytes)
149-
);
150-
bench_lookup!(
151140
lookup_std_highbits,
152-
StdHashMap,
153-
(0..SIZE).map(usize::swap_bytes)
141+
lookup_fx_random,
142+
lookup_std_random
154143
);
155-
bench_lookup!(lookup_fx_random, FxHashMap, RandomKeys::new(SIZE));
156-
bench_lookup!(lookup_std_random, StdHashMap, RandomKeys::new(SIZE));
157144

158145
macro_rules! bench_lookup_fail {
159-
($name:ident, $maptype:ident, $keydist:expr, $keydist2:expr) => {
146+
($name:ident, $maptype:ident, $keydist:expr) => {
160147
#[bench]
161148
fn $name(b: &mut Bencher) {
162149
let mut m = $maptype::default();
163-
for i in $keydist {
150+
let mut iter = $keydist;
151+
for i in (&mut iter).take(SIZE) {
164152
m.insert(i, i);
165153
}
166154

167155
b.iter(|| {
168-
for i in $keydist2 {
156+
for i in (&mut iter).take(SIZE) {
169157
black_box(m.get(&i));
170158
}
171159
})
172160
}
173161
};
174162
}
175163

176-
bench_lookup_fail!(lookup_fail_fx_serial, FxHashMap, 0..SIZE, SIZE..SIZE * 2);
177-
bench_lookup_fail!(lookup_fail_std_serial, StdHashMap, 0..SIZE, SIZE..SIZE * 2);
178-
bench_lookup_fail!(
164+
bench_suite!(
165+
bench_lookup_fail,
166+
lookup_fail_fx_serial,
167+
lookup_fail_std_serial,
179168
lookup_fail_fx_highbits,
180-
FxHashMap,
181-
(0..SIZE).map(usize::swap_bytes),
182-
(SIZE..SIZE * 2).map(usize::swap_bytes)
183-
);
184-
bench_lookup_fail!(
185169
lookup_fail_std_highbits,
186-
StdHashMap,
187-
(0..SIZE).map(usize::swap_bytes),
188-
(SIZE..SIZE * 2).map(usize::swap_bytes)
189-
);
190-
bench_lookup_fail!(
191170
lookup_fail_fx_random,
192-
FxHashMap,
193-
RandomKeys::new(SIZE),
194-
RandomKeys::new2(SIZE)
195-
);
196-
bench_lookup_fail!(
197-
lookup_fail_std_random,
198-
StdHashMap,
199-
RandomKeys::new(SIZE),
200-
RandomKeys::new2(SIZE)
171+
lookup_fail_std_random
201172
);
202173

203174
macro_rules! bench_iter {
204175
($name:ident, $maptype:ident, $keydist:expr) => {
205176
#[bench]
206177
fn $name(b: &mut Bencher) {
207178
let mut m = $maptype::default();
208-
for i in $keydist {
179+
for i in ($keydist).take(SIZE) {
209180
m.insert(i, i);
210181
}
211182

@@ -218,17 +189,12 @@ macro_rules! bench_iter {
218189
};
219190
}
220191

221-
bench_iter!(iter_fx_serial, FxHashMap, 0..SIZE);
222-
bench_iter!(iter_std_serial, StdHashMap, 0..SIZE);
223-
bench_iter!(
192+
bench_suite!(
193+
bench_iter,
194+
iter_fx_serial,
195+
iter_std_serial,
224196
iter_fx_highbits,
225-
FxHashMap,
226-
(0..SIZE).map(usize::swap_bytes)
227-
);
228-
bench_iter!(
229197
iter_std_highbits,
230-
StdHashMap,
231-
(0..SIZE).map(usize::swap_bytes)
198+
iter_fx_random,
199+
iter_std_random
232200
);
233-
bench_iter!(iter_fx_random, FxHashMap, RandomKeys::new(SIZE));
234-
bench_iter!(iter_std_random, StdHashMap, RandomKeys::new(SIZE));

0 commit comments

Comments
 (0)