1
1
use std:: collections:: BTreeMap ;
2
2
use std:: iter:: Iterator ;
3
- use std:: ops:: Bound :: { Excluded , Unbounded } ;
3
+ use std:: ops:: RangeBounds ;
4
4
use std:: vec:: Vec ;
5
5
6
6
use rand:: { seq:: SliceRandom , thread_rng, Rng } ;
@@ -117,7 +117,7 @@ map_find_rand_bench! {find_rand_10_000, 10_000, BTreeMap}
117
117
map_find_seq_bench ! { find_seq_100, 100 , BTreeMap }
118
118
map_find_seq_bench ! { find_seq_10_000, 10_000 , BTreeMap }
119
119
120
- fn bench_iter ( b : & mut Bencher , size : i32 ) {
120
+ fn bench_iteration ( b : & mut Bencher , size : i32 ) {
121
121
let mut map = BTreeMap :: < i32 , i32 > :: new ( ) ;
122
122
let mut rng = thread_rng ( ) ;
123
123
@@ -133,21 +133,21 @@ fn bench_iter(b: &mut Bencher, size: i32) {
133
133
}
134
134
135
135
#[ bench]
136
- pub fn iter_20 ( b : & mut Bencher ) {
137
- bench_iter ( b, 20 ) ;
136
+ pub fn iteration_20 ( b : & mut Bencher ) {
137
+ bench_iteration ( b, 20 ) ;
138
138
}
139
139
140
140
#[ bench]
141
- pub fn iter_1000 ( b : & mut Bencher ) {
142
- bench_iter ( b, 1000 ) ;
141
+ pub fn iteration_1000 ( b : & mut Bencher ) {
142
+ bench_iteration ( b, 1000 ) ;
143
143
}
144
144
145
145
#[ bench]
146
- pub fn iter_100000 ( b : & mut Bencher ) {
147
- bench_iter ( b, 100000 ) ;
146
+ pub fn iteration_100000 ( b : & mut Bencher ) {
147
+ bench_iteration ( b, 100000 ) ;
148
148
}
149
149
150
- fn bench_iter_mut ( b : & mut Bencher , size : i32 ) {
150
+ fn bench_iteration_mut ( b : & mut Bencher , size : i32 ) {
151
151
let mut map = BTreeMap :: < i32 , i32 > :: new ( ) ;
152
152
let mut rng = thread_rng ( ) ;
153
153
@@ -163,18 +163,18 @@ fn bench_iter_mut(b: &mut Bencher, size: i32) {
163
163
}
164
164
165
165
#[ bench]
166
- pub fn iter_mut_20 ( b : & mut Bencher ) {
167
- bench_iter_mut ( b, 20 ) ;
166
+ pub fn iteration_mut_20 ( b : & mut Bencher ) {
167
+ bench_iteration_mut ( b, 20 ) ;
168
168
}
169
169
170
170
#[ bench]
171
- pub fn iter_mut_1000 ( b : & mut Bencher ) {
172
- bench_iter_mut ( b, 1000 ) ;
171
+ pub fn iteration_mut_1000 ( b : & mut Bencher ) {
172
+ bench_iteration_mut ( b, 1000 ) ;
173
173
}
174
174
175
175
#[ bench]
176
- pub fn iter_mut_100000 ( b : & mut Bencher ) {
177
- bench_iter_mut ( b, 100000 ) ;
176
+ pub fn iteration_mut_100000 ( b : & mut Bencher ) {
177
+ bench_iteration_mut ( b, 100000 ) ;
178
178
}
179
179
180
180
fn bench_first_and_last ( b : & mut Bencher , size : i32 ) {
@@ -202,57 +202,83 @@ pub fn first_and_last_10k(b: &mut Bencher) {
202
202
bench_first_and_last ( b, 10_000 ) ;
203
203
}
204
204
205
- #[ bench]
206
- pub fn range_excluded_excluded ( b : & mut Bencher ) {
207
- let size = 144 ;
208
- let map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
205
+ const BENCH_RANGE_SIZE : i32 = 145 ;
206
+ const BENCH_RANGE_COUNT : i32 = BENCH_RANGE_SIZE * ( BENCH_RANGE_SIZE - 1 ) / 2 ;
207
+
208
+ fn bench_range < F , R > ( b : & mut Bencher , f : F )
209
+ where
210
+ F : Fn ( i32 , i32 ) -> R ,
211
+ R : RangeBounds < i32 > ,
212
+ {
213
+ let map: BTreeMap < _ , _ > = ( 0 ..BENCH_RANGE_SIZE ) . map ( |i| ( i, i) ) . collect ( ) ;
209
214
b. iter ( || {
210
- for first in 0 ..size {
211
- for last in first + 1 ..size {
212
- black_box ( map. range ( ( Excluded ( first) , Excluded ( last) ) ) ) ;
215
+ let mut c = 0 ;
216
+ for i in 0 ..BENCH_RANGE_SIZE {
217
+ for j in i + 1 ..BENCH_RANGE_SIZE {
218
+ black_box ( map. range ( f ( i, j) ) ) ;
219
+ c += 1 ;
213
220
}
214
221
}
222
+ debug_assert_eq ! ( c, BENCH_RANGE_COUNT ) ;
215
223
} ) ;
216
224
}
217
225
218
226
#[ bench]
219
- pub fn range_excluded_unbounded ( b : & mut Bencher ) {
220
- let size = 144 ;
221
- let map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
222
- b. iter ( || {
223
- for first in 0 ..size {
224
- black_box ( map. range ( ( Excluded ( first) , Unbounded ) ) ) ;
225
- }
226
- } ) ;
227
+ pub fn range_included_excluded ( b : & mut Bencher ) {
228
+ bench_range ( b, |i, j| i..j) ;
227
229
}
228
230
229
231
#[ bench]
230
232
pub fn range_included_included ( b : & mut Bencher ) {
231
- let size = 144 ;
232
- let map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
233
- b. iter ( || {
234
- for first in 0 ..size {
235
- for last in first..size {
236
- black_box ( map. range ( first..=last) ) ;
237
- }
238
- }
239
- } ) ;
233
+ bench_range ( b, |i, j| i..=j) ;
240
234
}
241
235
242
236
#[ bench]
243
237
pub fn range_included_unbounded ( b : & mut Bencher ) {
244
- let size = 144 ;
238
+ bench_range ( b, |i, _| i..) ;
239
+ }
240
+
241
+ #[ bench]
242
+ pub fn range_unbounded_unbounded ( b : & mut Bencher ) {
243
+ bench_range ( b, |_, _| ..) ;
244
+ }
245
+
246
+ fn bench_iter ( b : & mut Bencher , repeats : i32 , size : i32 ) {
245
247
let map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
246
248
b. iter ( || {
247
- for first in 0 ..size {
248
- black_box ( map. range ( first.. ) ) ;
249
+ for _ in 0 ..repeats {
250
+ black_box ( map. iter ( ) ) ;
249
251
}
250
252
} ) ;
251
253
}
252
254
255
+ /// Contrast range_unbounded_unbounded with `iter()`.
253
256
#[ bench]
254
- pub fn range_unbounded_unbounded ( b : & mut Bencher ) {
255
- let size = 144 ;
256
- let map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
257
- b. iter ( || map. range ( ..) ) ;
257
+ pub fn range_unbounded_vs_iter ( b : & mut Bencher ) {
258
+ bench_iter ( b, BENCH_RANGE_COUNT , BENCH_RANGE_SIZE ) ;
259
+ }
260
+
261
+ #[ bench]
262
+ pub fn iter_0 ( b : & mut Bencher ) {
263
+ bench_iter ( b, 1_000 , 0 ) ;
264
+ }
265
+
266
+ #[ bench]
267
+ pub fn iter_1 ( b : & mut Bencher ) {
268
+ bench_iter ( b, 1_000 , 1 ) ;
269
+ }
270
+
271
+ #[ bench]
272
+ pub fn iter_100 ( b : & mut Bencher ) {
273
+ bench_iter ( b, 1_000 , 100 ) ;
274
+ }
275
+
276
+ #[ bench]
277
+ pub fn iter_10k ( b : & mut Bencher ) {
278
+ bench_iter ( b, 1_000 , 10_000 ) ;
279
+ }
280
+
281
+ #[ bench]
282
+ pub fn iter_1m ( b : & mut Bencher ) {
283
+ bench_iter ( b, 1_000 , 1_000_000 ) ;
258
284
}
0 commit comments