Skip to content

Commit 8f5c66c

Browse files
committed
Introduce BTreeMap benches of iter itself
1 parent 3360cc3 commit 8f5c66c

File tree

1 file changed

+72
-46
lines changed
  • src/liballoc/benches/btree

1 file changed

+72
-46
lines changed

src/liballoc/benches/btree/map.rs

Lines changed: 72 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::BTreeMap;
22
use std::iter::Iterator;
3-
use std::ops::Bound::{Excluded, Unbounded};
3+
use std::ops::RangeBounds;
44
use std::vec::Vec;
55

66
use rand::{seq::SliceRandom, thread_rng, Rng};
@@ -117,7 +117,7 @@ map_find_rand_bench! {find_rand_10_000, 10_000, BTreeMap}
117117
map_find_seq_bench! {find_seq_100, 100, BTreeMap}
118118
map_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

180180
fn 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]
230232
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);
240234
}
241235

242236
#[bench]
243237
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) {
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

Comments
 (0)