11use std:: collections:: BTreeMap ;
22use std:: iter:: Iterator ;
3- use std:: ops:: Bound :: { Excluded , Unbounded } ;
3+ use std:: ops:: RangeBounds ;
44use std:: vec:: Vec ;
55
66use rand:: { seq:: SliceRandom , thread_rng, Rng } ;
@@ -117,7 +117,7 @@ map_find_rand_bench! {find_rand_10_000, 10_000, BTreeMap}
117117map_find_seq_bench ! { find_seq_100, 100 , BTreeMap }
118118map_find_seq_bench ! { find_seq_10_000, 10_000 , BTreeMap }
119119
120- fn bench_iter ( b : & mut Bencher , size : i32 ) {
120+ fn bench_iteration ( b : & mut Bencher , size : i32 ) {
121121 let mut map = BTreeMap :: < i32 , i32 > :: new ( ) ;
122122 let mut rng = thread_rng ( ) ;
123123
@@ -133,21 +133,21 @@ fn bench_iter(b: &mut Bencher, size: i32) {
133133}
134134
135135#[ 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 ) ;
138138}
139139
140140#[ 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 ) ;
143143}
144144
145145#[ 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 ) ;
148148}
149149
150- fn bench_iter_mut ( b : & mut Bencher , size : i32 ) {
150+ fn bench_iteration_mut ( b : & mut Bencher , size : i32 ) {
151151 let mut map = BTreeMap :: < i32 , i32 > :: new ( ) ;
152152 let mut rng = thread_rng ( ) ;
153153
@@ -163,18 +163,18 @@ fn bench_iter_mut(b: &mut Bencher, size: i32) {
163163}
164164
165165#[ 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 ) ;
168168}
169169
170170#[ 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 ) ;
173173}
174174
175175#[ 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 ) ;
178178}
179179
180180fn bench_first_and_last ( b : & mut Bencher , size : i32 ) {
@@ -202,57 +202,83 @@ pub fn first_and_last_10k(b: &mut Bencher) {
202202 bench_first_and_last ( b, 10_000 ) ;
203203}
204204
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 ( ) ;
209214 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 ;
213220 }
214221 }
222+ debug_assert_eq ! ( c, BENCH_RANGE_COUNT ) ;
215223 } ) ;
216224}
217225
218226#[ 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) ;
227229}
228230
229231#[ bench]
230232pub 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) ;
240234}
241235
242236#[ bench]
243237pub 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 ) {
245247 let map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
246248 b. iter ( || {
247- for first in 0 ..size {
248- black_box ( map. range ( first.. ) ) ;
249+ for _ in 0 ..repeats {
250+ black_box ( map. iter ( ) ) ;
249251 }
250252 } ) ;
251253}
252254
255+ /// Contrast range_unbounded_unbounded with `iter()`.
253256#[ 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 ) ;
258284}
0 commit comments