1 use std::collections::BTreeMap;
2 use std::iter::Iterator;
3 use std::ops::RangeBounds;
6 use rand::{seq::SliceRandom, thread_rng, Rng};
7 use test::{black_box, Bencher};
9 macro_rules! map_insert_rand_bench {
10 ($name: ident, $n: expr, $map: ident) => {
12 pub fn $name(b: &mut Bencher) {
14 let mut map = $map::new();
16 let mut rng = thread_rng();
19 let i = rng.gen::<usize>() % n;
25 let k = rng.gen::<usize>() % n;
34 macro_rules! map_insert_seq_bench {
35 ($name: ident, $n: expr, $map: ident) => {
37 pub fn $name(b: &mut Bencher) {
38 let mut map = $map::new();
42 map.insert(i * 2, i * 2);
57 macro_rules! map_find_rand_bench {
58 ($name: ident, $n: expr, $map: ident) => {
60 pub fn $name(b: &mut Bencher) {
61 let mut map = $map::new();
65 let mut rng = thread_rng();
66 let mut keys: Vec<_> = (0..n).map(|_| rng.gen::<usize>() % n).collect();
72 keys.shuffle(&mut rng);
77 let t = map.get(&keys[i]);
85 macro_rules! map_find_seq_bench {
86 ($name: ident, $n: expr, $map: ident) => {
88 pub fn $name(b: &mut Bencher) {
89 let mut map = $map::new();
108 map_insert_rand_bench! {insert_rand_100, 100, BTreeMap}
109 map_insert_rand_bench! {insert_rand_10_000, 10_000, BTreeMap}
111 map_insert_seq_bench! {insert_seq_100, 100, BTreeMap}
112 map_insert_seq_bench! {insert_seq_10_000, 10_000, BTreeMap}
114 map_find_rand_bench! {find_rand_100, 100, BTreeMap}
115 map_find_rand_bench! {find_rand_10_000, 10_000, BTreeMap}
117 map_find_seq_bench! {find_seq_100, 100, BTreeMap}
118 map_find_seq_bench! {find_seq_10_000, 10_000, BTreeMap}
120 fn bench_iteration(b: &mut Bencher, size: i32) {
121 let mut map = BTreeMap::<i32, i32>::new();
122 let mut rng = thread_rng();
125 map.insert(rng.gen(), rng.gen());
136 pub fn iteration_20(b: &mut Bencher) {
137 bench_iteration(b, 20);
141 pub fn iteration_1000(b: &mut Bencher) {
142 bench_iteration(b, 1000);
146 pub fn iteration_100000(b: &mut Bencher) {
147 bench_iteration(b, 100000);
150 fn bench_iteration_mut(b: &mut Bencher, size: i32) {
151 let mut map = BTreeMap::<i32, i32>::new();
152 let mut rng = thread_rng();
155 map.insert(rng.gen(), rng.gen());
159 for kv in map.iter_mut() {
166 pub fn iteration_mut_20(b: &mut Bencher) {
167 bench_iteration_mut(b, 20);
171 pub fn iteration_mut_1000(b: &mut Bencher) {
172 bench_iteration_mut(b, 1000);
176 pub fn iteration_mut_100000(b: &mut Bencher) {
177 bench_iteration_mut(b, 100000);
180 fn bench_first_and_last(b: &mut Bencher, size: i32) {
181 let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
184 black_box(map.first_key_value());
185 black_box(map.last_key_value());
191 pub fn first_and_last_0(b: &mut Bencher) {
192 bench_first_and_last(b, 0);
196 pub fn first_and_last_100(b: &mut Bencher) {
197 bench_first_and_last(b, 100);
201 pub fn first_and_last_10k(b: &mut Bencher) {
202 bench_first_and_last(b, 10_000);
205 const BENCH_RANGE_SIZE: i32 = 145;
206 const BENCH_RANGE_COUNT: i32 = BENCH_RANGE_SIZE * (BENCH_RANGE_SIZE - 1) / 2;
208 fn bench_range<F, R>(b: &mut Bencher, f: F)
210 F: Fn(i32, i32) -> R,
213 let map: BTreeMap<_, _> = (0..BENCH_RANGE_SIZE).map(|i| (i, i)).collect();
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)));
222 debug_assert_eq!(c, BENCH_RANGE_COUNT);
227 pub fn range_included_excluded(b: &mut Bencher) {
228 bench_range(b, |i, j| i..j);
232 pub fn range_included_included(b: &mut Bencher) {
233 bench_range(b, |i, j| i..=j);
237 pub fn range_included_unbounded(b: &mut Bencher) {
238 bench_range(b, |i, _| i..);
242 pub fn range_unbounded_unbounded(b: &mut Bencher) {
243 bench_range(b, |_, _| ..);
246 fn bench_iter(b: &mut Bencher, repeats: i32, size: i32) {
247 let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
249 for _ in 0..repeats {
250 black_box(map.iter());
255 /// Contrast range_unbounded_unbounded with `iter()`.
257 pub fn range_unbounded_vs_iter(b: &mut Bencher) {
258 bench_iter(b, BENCH_RANGE_COUNT, BENCH_RANGE_SIZE);
262 pub fn iter_0(b: &mut Bencher) {
263 bench_iter(b, 1_000, 0);
267 pub fn iter_1(b: &mut Bencher) {
268 bench_iter(b, 1_000, 1);
272 pub fn iter_100(b: &mut Bencher) {
273 bench_iter(b, 1_000, 100);
277 pub fn iter_10k(b: &mut Bencher) {
278 bench_iter(b, 1_000, 10_000);
282 pub fn iter_1m(b: &mut Bencher) {
283 bench_iter(b, 1_000, 1_000_000);
286 const FAT: usize = 256;
288 // The returned map has small keys and values.
289 // Benchmarks on it have a counterpart in set.rs with the same keys and no values at all.
290 fn slim_map(n: usize) -> BTreeMap<usize, usize> {
291 (0..n).map(|i| (i, i)).collect::<BTreeMap<_, _>>()
294 // The returned map has small keys and large values.
295 fn fat_val_map(n: usize) -> BTreeMap<usize, [usize; FAT]> {
296 (0..n).map(|i| (i, [i; FAT])).collect::<BTreeMap<_, _>>()
300 pub fn clone_slim_100(b: &mut Bencher) {
301 let src = slim_map(100);
302 b.iter(|| src.clone())
306 pub fn clone_slim_100_and_clear(b: &mut Bencher) {
307 let src = slim_map(100);
308 b.iter(|| src.clone().clear())
312 pub fn clone_slim_100_and_drain_all(b: &mut Bencher) {
313 let src = slim_map(100);
314 b.iter(|| src.clone().drain_filter(|_, _| true).count())
318 pub fn clone_slim_100_and_drain_half(b: &mut Bencher) {
319 let src = slim_map(100);
321 let mut map = src.clone();
322 assert_eq!(map.drain_filter(|i, _| i % 2 == 0).count(), 100 / 2);
323 assert_eq!(map.len(), 100 / 2);
328 pub fn clone_slim_100_and_into_iter(b: &mut Bencher) {
329 let src = slim_map(100);
330 b.iter(|| src.clone().into_iter().count())
334 pub fn clone_slim_100_and_pop_all(b: &mut Bencher) {
335 let src = slim_map(100);
337 let mut map = src.clone();
338 while map.pop_first().is_some() {}
344 pub fn clone_slim_100_and_remove_all(b: &mut Bencher) {
345 let src = slim_map(100);
347 let mut map = src.clone();
348 while let Some(elt) = map.iter().map(|(&i, _)| i).next() {
349 let v = map.remove(&elt);
350 debug_assert!(v.is_some());
357 pub fn clone_slim_100_and_remove_half(b: &mut Bencher) {
358 let src = slim_map(100);
360 let mut map = src.clone();
361 for i in (0..100).step_by(2) {
362 let v = map.remove(&i);
363 debug_assert!(v.is_some());
365 assert_eq!(map.len(), 100 / 2);
371 pub fn clone_slim_10k(b: &mut Bencher) {
372 let src = slim_map(10_000);
373 b.iter(|| src.clone())
377 pub fn clone_slim_10k_and_clear(b: &mut Bencher) {
378 let src = slim_map(10_000);
379 b.iter(|| src.clone().clear())
383 pub fn clone_slim_10k_and_drain_all(b: &mut Bencher) {
384 let src = slim_map(10_000);
385 b.iter(|| src.clone().drain_filter(|_, _| true).count())
389 pub fn clone_slim_10k_and_drain_half(b: &mut Bencher) {
390 let src = slim_map(10_000);
392 let mut map = src.clone();
393 assert_eq!(map.drain_filter(|i, _| i % 2 == 0).count(), 10_000 / 2);
394 assert_eq!(map.len(), 10_000 / 2);
399 pub fn clone_slim_10k_and_into_iter(b: &mut Bencher) {
400 let src = slim_map(10_000);
401 b.iter(|| src.clone().into_iter().count())
405 pub fn clone_slim_10k_and_pop_all(b: &mut Bencher) {
406 let src = slim_map(10_000);
408 let mut map = src.clone();
409 while map.pop_first().is_some() {}
415 pub fn clone_slim_10k_and_remove_all(b: &mut Bencher) {
416 let src = slim_map(10_000);
418 let mut map = src.clone();
419 while let Some(elt) = map.iter().map(|(&i, _)| i).next() {
420 let v = map.remove(&elt);
421 debug_assert!(v.is_some());
428 pub fn clone_slim_10k_and_remove_half(b: &mut Bencher) {
429 let src = slim_map(10_000);
431 let mut map = src.clone();
432 for i in (0..10_000).step_by(2) {
433 let v = map.remove(&i);
434 debug_assert!(v.is_some());
436 assert_eq!(map.len(), 10_000 / 2);
442 pub fn clone_fat_val_100(b: &mut Bencher) {
443 let src = fat_val_map(100);
444 b.iter(|| src.clone())
448 pub fn clone_fat_val_100_and_clear(b: &mut Bencher) {
449 let src = fat_val_map(100);
450 b.iter(|| src.clone().clear())
454 pub fn clone_fat_val_100_and_drain_all(b: &mut Bencher) {
455 let src = fat_val_map(100);
456 b.iter(|| src.clone().drain_filter(|_, _| true).count())
460 pub fn clone_fat_val_100_and_drain_half(b: &mut Bencher) {
461 let src = fat_val_map(100);
463 let mut map = src.clone();
464 assert_eq!(map.drain_filter(|i, _| i % 2 == 0).count(), 100 / 2);
465 assert_eq!(map.len(), 100 / 2);
470 pub fn clone_fat_val_100_and_into_iter(b: &mut Bencher) {
471 let src = fat_val_map(100);
472 b.iter(|| src.clone().into_iter().count())
476 pub fn clone_fat_val_100_and_pop_all(b: &mut Bencher) {
477 let src = fat_val_map(100);
479 let mut map = src.clone();
480 while map.pop_first().is_some() {}
486 pub fn clone_fat_val_100_and_remove_all(b: &mut Bencher) {
487 let src = fat_val_map(100);
489 let mut map = src.clone();
490 while let Some(elt) = map.iter().map(|(&i, _)| i).next() {
491 let v = map.remove(&elt);
492 debug_assert!(v.is_some());
499 pub fn clone_fat_val_100_and_remove_half(b: &mut Bencher) {
500 let src = fat_val_map(100);
502 let mut map = src.clone();
503 for i in (0..100).step_by(2) {
504 let v = map.remove(&i);
505 debug_assert!(v.is_some());
507 assert_eq!(map.len(), 100 / 2);