@@ -22,49 +22,48 @@ type StdHashMap<K, V> = HashMap<K, V, RandomState>;
2222// A random key iterator.
2323#[ derive( Clone , Copy ) ]
2424struct RandomKeys {
25- remaining : usize ,
2625 state : usize ,
2726}
2827
2928impl 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
4634impl 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+
6160macro_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
9185macro_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
125117macro_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
158145macro_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
203174macro_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