1
1
// This benchmark suite contains some benchmarks along a set of dimensions:
2
- // Hasher: std default (SipHash) and crate default (FxHash ).
2
+ // Hasher: std default (SipHash) and crate default (AHash ).
3
3
// Int key distribution: low bit heavy, top bit heavy, and random.
4
4
// Task: basic functionality: insert, insert_erase, lookup, lookup_fail, iter
5
5
#![ feature( test) ]
@@ -15,7 +15,7 @@ use std::collections::hash_map::RandomState;
15
15
const SIZE : usize = 1000 ;
16
16
17
17
// The default hashmap when using this crate directly.
18
- type FxHashMap < K , V > = HashMap < K , V , DefaultHashBuilder > ;
18
+ type AHashMap < K , V > = HashMap < K , V , DefaultHashBuilder > ;
19
19
// This uses the hashmap from this crate with the default hasher of the stdlib.
20
20
type StdHashMap < K , V > = HashMap < K , V , RandomState > ;
21
21
@@ -41,18 +41,22 @@ impl Iterator for RandomKeys {
41
41
}
42
42
43
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 ..) ;
44
+ ( $bench_macro: ident, $bench_ahash_serial : ident, $bench_std_serial: ident,
45
+ $bench_ahash_highbits : ident, $bench_std_highbits: ident,
46
+ $bench_ahash_random : ident, $bench_std_random: ident) => {
47
+ $bench_macro!( $bench_ahash_serial , AHashMap , 0 ..) ;
48
48
$bench_macro!( $bench_std_serial, StdHashMap , 0 ..) ;
49
- $bench_macro!( $bench_fx_highbits, FxHashMap , ( 0 ..) . map( usize :: swap_bytes) ) ;
49
+ $bench_macro!(
50
+ $bench_ahash_highbits,
51
+ AHashMap ,
52
+ ( 0 ..) . map( usize :: swap_bytes)
53
+ ) ;
50
54
$bench_macro!(
51
55
$bench_std_highbits,
52
56
StdHashMap ,
53
57
( 0 ..) . map( usize :: swap_bytes)
54
58
) ;
55
- $bench_macro!( $bench_fx_random , FxHashMap , RandomKeys :: new( ) ) ;
59
+ $bench_macro!( $bench_ahash_random , AHashMap , RandomKeys :: new( ) ) ;
56
60
$bench_macro!( $bench_std_random, StdHashMap , RandomKeys :: new( ) ) ;
57
61
} ;
58
62
}
@@ -61,56 +65,60 @@ macro_rules! bench_insert {
61
65
( $name: ident, $maptype: ident, $keydist: expr) => {
62
66
#[ bench]
63
67
fn $name( b: & mut Bencher ) {
68
+ let mut m = $maptype:: with_capacity_and_hasher( SIZE , Default :: default ( ) ) ;
64
69
b. iter( || {
65
- let mut m = $maptype :: default ( ) ;
70
+ m . clear ( ) ;
66
71
for i in ( $keydist) . take( SIZE ) {
67
72
m. insert( i, i) ;
68
73
}
69
- black_box( m) ;
74
+ black_box( & mut m) ;
70
75
} )
71
76
}
72
77
} ;
73
78
}
74
79
75
80
bench_suite ! (
76
81
bench_insert,
77
- insert_fx_serial ,
82
+ insert_ahash_serial ,
78
83
insert_std_serial,
79
- insert_fx_highbits ,
84
+ insert_ahash_highbits ,
80
85
insert_std_highbits,
81
- insert_fx_random ,
86
+ insert_ahash_random ,
82
87
insert_std_random
83
88
) ;
84
89
85
90
macro_rules! bench_insert_erase {
86
91
( $name: ident, $maptype: ident, $keydist: expr) => {
87
92
#[ bench]
88
93
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) ;
94
+ let mut base = $maptype:: default ( ) ;
95
+ for i in ( $keydist) . take( SIZE ) {
96
+ base. insert( i, i) ;
93
97
}
94
- let mut remove_iter = $keydist;
98
+ let skip = $keydist. skip ( SIZE ) ;
95
99
b. iter( || {
100
+ let mut m = base. clone( ) ;
101
+ let mut add_iter = skip. clone( ) ;
102
+ let mut remove_iter = $keydist;
96
103
// While keeping the size constant,
97
104
// replace the first keydist with the second.
98
105
for ( add, remove) in ( & mut add_iter) . zip( & mut remove_iter) . take( SIZE ) {
99
106
m. insert( add, add) ;
100
107
black_box( m. remove( & remove) ) ;
101
108
}
109
+ black_box( m) ;
102
110
} )
103
111
}
104
112
} ;
105
113
}
106
114
107
115
bench_suite ! (
108
116
bench_insert_erase,
109
- insert_erase_fx_serial ,
117
+ insert_erase_ahash_serial ,
110
118
insert_erase_std_serial,
111
- insert_erase_fx_highbits ,
119
+ insert_erase_ahash_highbits ,
112
120
insert_erase_std_highbits,
113
- insert_erase_fx_random ,
121
+ insert_erase_ahash_random ,
114
122
insert_erase_std_random
115
123
) ;
116
124
@@ -134,11 +142,11 @@ macro_rules! bench_lookup {
134
142
135
143
bench_suite ! (
136
144
bench_lookup,
137
- lookup_fx_serial ,
145
+ lookup_ahash_serial ,
138
146
lookup_std_serial,
139
- lookup_fx_highbits ,
147
+ lookup_ahash_highbits ,
140
148
lookup_std_highbits,
141
- lookup_fx_random ,
149
+ lookup_ahash_random ,
142
150
lookup_std_random
143
151
) ;
144
152
@@ -163,11 +171,11 @@ macro_rules! bench_lookup_fail {
163
171
164
172
bench_suite ! (
165
173
bench_lookup_fail,
166
- lookup_fail_fx_serial ,
174
+ lookup_fail_ahash_serial ,
167
175
lookup_fail_std_serial,
168
- lookup_fail_fx_highbits ,
176
+ lookup_fail_ahash_highbits ,
169
177
lookup_fail_std_highbits,
170
- lookup_fail_fx_random ,
178
+ lookup_fail_ahash_random ,
171
179
lookup_fail_std_random
172
180
) ;
173
181
@@ -191,10 +199,10 @@ macro_rules! bench_iter {
191
199
192
200
bench_suite ! (
193
201
bench_iter,
194
- iter_fx_serial ,
202
+ iter_ahash_serial ,
195
203
iter_std_serial,
196
- iter_fx_highbits ,
204
+ iter_ahash_highbits ,
197
205
iter_std_highbits,
198
- iter_fx_random ,
206
+ iter_ahash_random ,
199
207
iter_std_random
200
208
) ;
0 commit comments