@@ -10,7 +10,10 @@ use test::{black_box, Bencher};
10
10
11
11
use hashbrown:: hash_map:: DefaultHashBuilder ;
12
12
use hashbrown:: HashMap ;
13
- use std:: collections:: hash_map:: RandomState ;
13
+ use std:: {
14
+ collections:: hash_map:: RandomState ,
15
+ sync:: atomic:: { self , AtomicUsize } ,
16
+ } ;
14
17
15
18
const SIZE : usize = 1000 ;
16
19
@@ -40,6 +43,19 @@ impl Iterator for RandomKeys {
40
43
}
41
44
}
42
45
46
+ // Just an arbitrary side effect to
47
+ lazy_static:: lazy_static! {
48
+ static ref SIDE_EFFECT : AtomicUsize = AtomicUsize :: new( 0 ) ;
49
+ }
50
+
51
+ #[ derive( Clone ) ]
52
+ struct DropType ( usize ) ;
53
+ impl Drop for DropType {
54
+ fn drop ( & mut self ) {
55
+ SIDE_EFFECT . fetch_add ( self . 0 , atomic:: Ordering :: SeqCst ) ;
56
+ }
57
+ }
58
+
43
59
macro_rules! bench_suite {
44
60
( $bench_macro: ident, $bench_ahash_serial: ident, $bench_std_serial: ident,
45
61
$bench_ahash_highbits: ident, $bench_std_highbits: ident,
@@ -69,10 +85,11 @@ macro_rules! bench_insert {
69
85
b. iter( || {
70
86
m. clear( ) ;
71
87
for i in ( $keydist) . take( SIZE ) {
72
- m. insert( i, i ) ;
88
+ m. insert( i, DropType ( i ) ) ;
73
89
}
74
90
black_box( & mut m) ;
75
- } )
91
+ } ) ;
92
+ eprintln!( "{}" , SIDE_EFFECT . load( atomic:: Ordering :: SeqCst ) ) ;
76
93
}
77
94
} ;
78
95
}
@@ -93,7 +110,7 @@ macro_rules! bench_insert_erase {
93
110
fn $name( b: & mut Bencher ) {
94
111
let mut base = $maptype:: default ( ) ;
95
112
for i in ( $keydist) . take( SIZE ) {
96
- base. insert( i, i ) ;
113
+ base. insert( i, DropType ( i ) ) ;
97
114
}
98
115
let skip = $keydist. skip( SIZE ) ;
99
116
b. iter( || {
@@ -103,11 +120,12 @@ macro_rules! bench_insert_erase {
103
120
// While keeping the size constant,
104
121
// replace the first keydist with the second.
105
122
for ( add, remove) in ( & mut add_iter) . zip( & mut remove_iter) . take( SIZE ) {
106
- m. insert( add, add) ;
123
+ m. insert( add, DropType ( add) ) ;
107
124
black_box( m. remove( & remove) ) ;
108
125
}
109
126
black_box( m) ;
110
- } )
127
+ } ) ;
128
+ eprintln!( "{}" , SIDE_EFFECT . load( atomic:: Ordering :: SeqCst ) ) ;
111
129
}
112
130
} ;
113
131
}
@@ -128,14 +146,15 @@ macro_rules! bench_lookup {
128
146
fn $name( b: & mut Bencher ) {
129
147
let mut m = $maptype:: default ( ) ;
130
148
for i in $keydist. take( SIZE ) {
131
- m. insert( i, i ) ;
149
+ m. insert( i, DropType ( i ) ) ;
132
150
}
133
151
134
152
b. iter( || {
135
153
for i in $keydist. take( SIZE ) {
136
154
black_box( m. get( & i) ) ;
137
155
}
138
- } )
156
+ } ) ;
157
+ eprintln!( "{}" , SIDE_EFFECT . load( atomic:: Ordering :: SeqCst ) ) ;
139
158
}
140
159
} ;
141
160
}
@@ -157,7 +176,7 @@ macro_rules! bench_lookup_fail {
157
176
let mut m = $maptype:: default ( ) ;
158
177
let mut iter = $keydist;
159
178
for i in ( & mut iter) . take( SIZE ) {
160
- m. insert( i, i ) ;
179
+ m. insert( i, DropType ( i ) ) ;
161
180
}
162
181
163
182
b. iter( || {
@@ -185,7 +204,7 @@ macro_rules! bench_iter {
185
204
fn $name( b: & mut Bencher ) {
186
205
let mut m = $maptype:: default ( ) ;
187
206
for i in ( $keydist) . take( SIZE ) {
188
- m. insert( i, i ) ;
207
+ m. insert( i, DropType ( i ) ) ;
189
208
}
190
209
191
210
b. iter( || {
@@ -211,7 +230,7 @@ bench_suite!(
211
230
fn clone_small ( b : & mut Bencher ) {
212
231
let mut m = HashMap :: new ( ) ;
213
232
for i in 0 ..10 {
214
- m. insert ( i, i ) ;
233
+ m. insert ( i, DropType ( i ) ) ;
215
234
}
216
235
217
236
b. iter ( || {
@@ -224,7 +243,7 @@ fn clone_from_small(b: &mut Bencher) {
224
243
let mut m = HashMap :: new ( ) ;
225
244
let mut m2 = HashMap :: new ( ) ;
226
245
for i in 0 ..10 {
227
- m. insert ( i, i ) ;
246
+ m. insert ( i, DropType ( i ) ) ;
228
247
}
229
248
230
249
b. iter ( || {
@@ -237,7 +256,7 @@ fn clone_from_small(b: &mut Bencher) {
237
256
fn clone_large ( b : & mut Bencher ) {
238
257
let mut m = HashMap :: new ( ) ;
239
258
for i in 0 ..1000 {
240
- m. insert ( i, i ) ;
259
+ m. insert ( i, DropType ( i ) ) ;
241
260
}
242
261
243
262
b. iter ( || {
@@ -250,7 +269,7 @@ fn clone_from_large(b: &mut Bencher) {
250
269
let mut m = HashMap :: new ( ) ;
251
270
let mut m2 = HashMap :: new ( ) ;
252
271
for i in 0 ..1000 {
253
- m. insert ( i, i ) ;
272
+ m. insert ( i, DropType ( i ) ) ;
254
273
}
255
274
256
275
b. iter ( || {
0 commit comments