Skip to content

Commit 319b63f

Browse files
committed
Merge with master
2 parents 78ec552 + b226638 commit 319b63f

File tree

10 files changed

+898
-474
lines changed

10 files changed

+898
-474
lines changed

benches/bench.rs

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use test::{black_box, Bencher};
1010

1111
use hashbrown::hash_map::DefaultHashBuilder;
1212
use hashbrown::HashMap;
13-
use std::collections::hash_map::RandomState;
13+
use std::{
14+
collections::hash_map::RandomState,
15+
sync::atomic::{self, AtomicUsize},
16+
};
1417

1518
const SIZE: usize = 1000;
1619

@@ -40,6 +43,20 @@ impl Iterator for RandomKeys {
4043
}
4144
}
4245

46+
// Just an arbitrary side effect to make the maps not shortcircuit to the non-dropping path
47+
// when dropping maps/entries (most real world usages likely have drop in the key or value)
48+
lazy_static::lazy_static! {
49+
static ref SIDE_EFFECT: AtomicUsize = AtomicUsize::new(0);
50+
}
51+
52+
#[derive(Clone)]
53+
struct DropType(usize);
54+
impl Drop for DropType {
55+
fn drop(&mut self) {
56+
SIDE_EFFECT.fetch_add(self.0, atomic::Ordering::SeqCst);
57+
}
58+
}
59+
4360
macro_rules! bench_suite {
4461
($bench_macro:ident, $bench_ahash_serial:ident, $bench_std_serial:ident,
4562
$bench_ahash_highbits:ident, $bench_std_highbits:ident,
@@ -69,10 +86,11 @@ macro_rules! bench_insert {
6986
b.iter(|| {
7087
m.clear();
7188
for i in ($keydist).take(SIZE) {
72-
m.insert(i, i);
89+
m.insert(i, DropType(i));
7390
}
7491
black_box(&mut m);
75-
})
92+
});
93+
eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst));
7694
}
7795
};
7896
}
@@ -93,7 +111,7 @@ macro_rules! bench_insert_erase {
93111
fn $name(b: &mut Bencher) {
94112
let mut base = $maptype::default();
95113
for i in ($keydist).take(SIZE) {
96-
base.insert(i, i);
114+
base.insert(i, DropType(i));
97115
}
98116
let skip = $keydist.skip(SIZE);
99117
b.iter(|| {
@@ -103,11 +121,12 @@ macro_rules! bench_insert_erase {
103121
// While keeping the size constant,
104122
// replace the first keydist with the second.
105123
for (add, remove) in (&mut add_iter).zip(&mut remove_iter).take(SIZE) {
106-
m.insert(add, add);
124+
m.insert(add, DropType(add));
107125
black_box(m.remove(&remove));
108126
}
109127
black_box(m);
110-
})
128+
});
129+
eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst));
111130
}
112131
};
113132
}
@@ -128,14 +147,15 @@ macro_rules! bench_lookup {
128147
fn $name(b: &mut Bencher) {
129148
let mut m = $maptype::default();
130149
for i in $keydist.take(SIZE) {
131-
m.insert(i, i);
150+
m.insert(i, DropType(i));
132151
}
133152

134153
b.iter(|| {
135154
for i in $keydist.take(SIZE) {
136155
black_box(m.get(&i));
137156
}
138-
})
157+
});
158+
eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst));
139159
}
140160
};
141161
}
@@ -157,7 +177,7 @@ macro_rules! bench_lookup_fail {
157177
let mut m = $maptype::default();
158178
let mut iter = $keydist;
159179
for i in (&mut iter).take(SIZE) {
160-
m.insert(i, i);
180+
m.insert(i, DropType(i));
161181
}
162182

163183
b.iter(|| {
@@ -185,7 +205,7 @@ macro_rules! bench_iter {
185205
fn $name(b: &mut Bencher) {
186206
let mut m = $maptype::default();
187207
for i in ($keydist).take(SIZE) {
188-
m.insert(i, i);
208+
m.insert(i, DropType(i));
189209
}
190210

191211
b.iter(|| {
@@ -211,7 +231,7 @@ bench_suite!(
211231
fn clone_small(b: &mut Bencher) {
212232
let mut m = HashMap::new();
213233
for i in 0..10 {
214-
m.insert(i, i);
234+
m.insert(i, DropType(i));
215235
}
216236

217237
b.iter(|| {
@@ -224,7 +244,7 @@ fn clone_from_small(b: &mut Bencher) {
224244
let mut m = HashMap::new();
225245
let mut m2 = HashMap::new();
226246
for i in 0..10 {
227-
m.insert(i, i);
247+
m.insert(i, DropType(i));
228248
}
229249

230250
b.iter(|| {
@@ -237,7 +257,7 @@ fn clone_from_small(b: &mut Bencher) {
237257
fn clone_large(b: &mut Bencher) {
238258
let mut m = HashMap::new();
239259
for i in 0..1000 {
240-
m.insert(i, i);
260+
m.insert(i, DropType(i));
241261
}
242262

243263
b.iter(|| {
@@ -250,7 +270,7 @@ fn clone_from_large(b: &mut Bencher) {
250270
let mut m = HashMap::new();
251271
let mut m2 = HashMap::new();
252272
for i in 0..1000 {
253-
m.insert(i, i);
273+
m.insert(i, DropType(i));
254274
}
255275

256276
b.iter(|| {

0 commit comments

Comments
 (0)