@@ -22,49 +22,48 @@ type StdHashMap<K, V> = HashMap<K, V, RandomState>;
22
22
// A random key iterator.
23
23
#[ derive( Clone , Copy ) ]
24
24
struct RandomKeys {
25
- remaining : usize ,
26
25
state : usize ,
27
26
}
28
27
29
28
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 }
43
31
}
44
32
}
45
33
46
34
impl Iterator for RandomKeys {
47
35
type Item = usize ;
48
36
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 )
58
40
}
59
41
}
60
42
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
+
61
60
macro_rules! bench_insert {
62
61
( $name: ident, $maptype: ident, $keydist: expr) => {
63
62
#[ bench]
64
63
fn $name( b: & mut Bencher ) {
65
64
b. iter( || {
66
65
let mut m = $maptype:: default ( ) ;
67
- for i in $keydist {
66
+ for i in ( $keydist) . take ( SIZE ) {
68
67
m. insert( i, i) ;
69
68
}
70
69
black_box( m) ;
@@ -73,139 +72,111 @@ macro_rules! bench_insert {
73
72
} ;
74
73
}
75
74
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,
79
79
insert_fx_highbits,
80
- FxHashMap ,
81
- ( 0 ..SIZE ) . map( usize :: swap_bytes)
82
- ) ;
83
- bench_insert ! (
84
80
insert_std_highbits,
85
- StdHashMap ,
86
- ( 0 .. SIZE ) . map ( usize :: swap_bytes )
81
+ insert_fx_random ,
82
+ insert_std_random
87
83
) ;
88
- bench_insert ! ( insert_fx_random, FxHashMap , RandomKeys :: new( SIZE ) ) ;
89
- bench_insert ! ( insert_std_random, StdHashMap , RandomKeys :: new( SIZE ) ) ;
90
84
91
85
macro_rules! bench_insert_erase {
92
86
( $name: ident, $maptype: ident, $keydist: expr) => {
93
87
#[ bench]
94
88
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;
95
95
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) ) ;
103
101
}
104
- black_box( m) ;
105
102
} )
106
103
}
107
104
} ;
108
105
}
109
106
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,
113
111
insert_erase_fx_highbits,
114
- FxHashMap ,
115
- ( 0 ..SIZE ) . map( usize :: swap_bytes)
116
- ) ;
117
- bench_insert_erase ! (
118
112
insert_erase_std_highbits,
119
- StdHashMap ,
120
- ( 0 .. SIZE ) . map ( usize :: swap_bytes )
113
+ insert_erase_fx_random ,
114
+ insert_erase_std_random
121
115
) ;
122
- bench_insert_erase ! ( insert_erase_fx_random, FxHashMap , RandomKeys :: new( SIZE ) ) ;
123
- bench_insert_erase ! ( insert_erase_std_random, StdHashMap , RandomKeys :: new( SIZE ) ) ;
124
116
125
117
macro_rules! bench_lookup {
126
118
( $name: ident, $maptype: ident, $keydist: expr) => {
127
119
#[ bench]
128
120
fn $name( b: & mut Bencher ) {
129
121
let mut m = $maptype:: default ( ) ;
130
- for i in $keydist {
122
+ for i in $keydist. take ( SIZE ) {
131
123
m. insert( i, i) ;
132
124
}
133
125
134
126
b. iter( || {
135
- for i in $keydist {
127
+ for i in $keydist. take ( SIZE ) {
136
128
black_box( m. get( & i) ) ;
137
129
}
138
130
} )
139
131
}
140
132
} ;
141
133
}
142
134
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,
146
139
lookup_fx_highbits,
147
- FxHashMap ,
148
- ( 0 ..SIZE ) . map( usize :: swap_bytes)
149
- ) ;
150
- bench_lookup ! (
151
140
lookup_std_highbits,
152
- StdHashMap ,
153
- ( 0 .. SIZE ) . map ( usize :: swap_bytes )
141
+ lookup_fx_random ,
142
+ lookup_std_random
154
143
) ;
155
- bench_lookup ! ( lookup_fx_random, FxHashMap , RandomKeys :: new( SIZE ) ) ;
156
- bench_lookup ! ( lookup_std_random, StdHashMap , RandomKeys :: new( SIZE ) ) ;
157
144
158
145
macro_rules! bench_lookup_fail {
159
- ( $name: ident, $maptype: ident, $keydist: expr, $keydist2 : expr ) => {
146
+ ( $name: ident, $maptype: ident, $keydist: expr) => {
160
147
#[ bench]
161
148
fn $name( b: & mut Bencher ) {
162
149
let mut m = $maptype:: default ( ) ;
163
- for i in $keydist {
150
+ let mut iter = $keydist;
151
+ for i in ( & mut iter) . take( SIZE ) {
164
152
m. insert( i, i) ;
165
153
}
166
154
167
155
b. iter( || {
168
- for i in $keydist2 {
156
+ for i in ( & mut iter ) . take ( SIZE ) {
169
157
black_box( m. get( & i) ) ;
170
158
}
171
159
} )
172
160
}
173
161
} ;
174
162
}
175
163
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,
179
168
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 ! (
185
169
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 ! (
191
170
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
201
172
) ;
202
173
203
174
macro_rules! bench_iter {
204
175
( $name: ident, $maptype: ident, $keydist: expr) => {
205
176
#[ bench]
206
177
fn $name( b: & mut Bencher ) {
207
178
let mut m = $maptype:: default ( ) ;
208
- for i in $keydist {
179
+ for i in ( $keydist) . take ( SIZE ) {
209
180
m. insert( i, i) ;
210
181
}
211
182
@@ -218,17 +189,12 @@ macro_rules! bench_iter {
218
189
} ;
219
190
}
220
191
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,
224
196
iter_fx_highbits,
225
- FxHashMap ,
226
- ( 0 ..SIZE ) . map( usize :: swap_bytes)
227
- ) ;
228
- bench_iter ! (
229
197
iter_std_highbits,
230
- StdHashMap ,
231
- ( 0 .. SIZE ) . map ( usize :: swap_bytes )
198
+ iter_fx_random ,
199
+ iter_std_random
232
200
) ;
233
- bench_iter ! ( iter_fx_random, FxHashMap , RandomKeys :: new( SIZE ) ) ;
234
- bench_iter ! ( iter_std_random, StdHashMap , RandomKeys :: new( SIZE ) ) ;
0 commit comments