]>
Commit | Line | Data |
---|---|---|
9fa01778 XL |
1 | use std::collections::BTreeSet; |
2 | ||
3 | use rand::{thread_rng, Rng}; | |
60c5eb7d | 4 | use test::Bencher; |
9fa01778 | 5 | |
532ac7d7 | 6 | fn random(n: usize) -> BTreeSet<usize> { |
9fa01778 | 7 | let mut rng = thread_rng(); |
532ac7d7 XL |
8 | let mut set = BTreeSet::new(); |
9 | while set.len() < n { | |
10 | set.insert(rng.gen()); | |
9fa01778 | 11 | } |
532ac7d7 XL |
12 | assert_eq!(set.len(), n); |
13 | set | |
9fa01778 XL |
14 | } |
15 | ||
532ac7d7 XL |
16 | fn neg(n: usize) -> BTreeSet<i32> { |
17 | let mut set = BTreeSet::new(); | |
18 | for i in -(n as i32)..=-1 { | |
19 | set.insert(i); | |
9fa01778 | 20 | } |
532ac7d7 XL |
21 | assert_eq!(set.len(), n); |
22 | set | |
9fa01778 XL |
23 | } |
24 | ||
532ac7d7 XL |
25 | fn pos(n: usize) -> BTreeSet<i32> { |
26 | let mut set = BTreeSet::new(); | |
27 | for i in 1..=(n as i32) { | |
28 | set.insert(i); | |
9fa01778 | 29 | } |
532ac7d7 XL |
30 | assert_eq!(set.len(), n); |
31 | set | |
9fa01778 XL |
32 | } |
33 | ||
532ac7d7 XL |
34 | fn stagger(n1: usize, factor: usize) -> [BTreeSet<u32>; 2] { |
35 | let n2 = n1 * factor; | |
36 | let mut sets = [BTreeSet::new(), BTreeSet::new()]; | |
37 | for i in 0..(n1 + n2) { | |
38 | let b = i % (factor + 1) != 0; | |
39 | sets[b as usize].insert(i as u32); | |
9fa01778 | 40 | } |
532ac7d7 XL |
41 | assert_eq!(sets[0].len(), n1); |
42 | assert_eq!(sets[1].len(), n2); | |
43 | sets | |
9fa01778 XL |
44 | } |
45 | ||
532ac7d7 XL |
46 | macro_rules! set_bench { |
47 | ($name: ident, $set_func: ident, $result_func: ident, $sets: expr) => { | |
9fa01778 XL |
48 | #[bench] |
49 | pub fn $name(b: &mut Bencher) { | |
50 | // setup | |
51 | let sets = $sets; | |
52 | ||
53 | // measure | |
60c5eb7d | 54 | b.iter(|| sets[0].$set_func(&sets[1]).$result_func()) |
9fa01778 XL |
55 | } |
56 | }; | |
57 | } | |
58 | ||
532ac7d7 XL |
59 | set_bench! {intersection_100_neg_vs_100_pos, intersection, count, [neg(100), pos(100)]} |
60 | set_bench! {intersection_100_neg_vs_10k_pos, intersection, count, [neg(100), pos(10_000)]} | |
61 | set_bench! {intersection_100_pos_vs_100_neg, intersection, count, [pos(100), neg(100)]} | |
62 | set_bench! {intersection_100_pos_vs_10k_neg, intersection, count, [pos(100), neg(10_000)]} | |
63 | set_bench! {intersection_10k_neg_vs_100_pos, intersection, count, [neg(10_000), pos(100)]} | |
64 | set_bench! {intersection_10k_neg_vs_10k_pos, intersection, count, [neg(10_000), pos(10_000)]} | |
65 | set_bench! {intersection_10k_pos_vs_100_neg, intersection, count, [pos(10_000), neg(100)]} | |
66 | set_bench! {intersection_10k_pos_vs_10k_neg, intersection, count, [pos(10_000), neg(10_000)]} | |
67 | set_bench! {intersection_random_100_vs_100, intersection, count, [random(100), random(100)]} | |
68 | set_bench! {intersection_random_100_vs_10k, intersection, count, [random(100), random(10_000)]} | |
69 | set_bench! {intersection_random_10k_vs_100, intersection, count, [random(10_000), random(100)]} | |
70 | set_bench! {intersection_random_10k_vs_10k, intersection, count, [random(10_000), random(10_000)]} | |
71 | set_bench! {intersection_staggered_100_vs_100, intersection, count, stagger(100, 1)} | |
72 | set_bench! {intersection_staggered_10k_vs_10k, intersection, count, stagger(10_000, 1)} | |
73 | set_bench! {intersection_staggered_100_vs_10k, intersection, count, stagger(100, 100)} | |
74 | set_bench! {difference_random_100_vs_100, difference, count, [random(100), random(100)]} | |
75 | set_bench! {difference_random_100_vs_10k, difference, count, [random(100), random(10_000)]} | |
76 | set_bench! {difference_random_10k_vs_100, difference, count, [random(10_000), random(100)]} | |
77 | set_bench! {difference_random_10k_vs_10k, difference, count, [random(10_000), random(10_000)]} | |
78 | set_bench! {difference_staggered_100_vs_100, difference, count, stagger(100, 1)} | |
79 | set_bench! {difference_staggered_10k_vs_10k, difference, count, stagger(10_000, 1)} | |
80 | set_bench! {difference_staggered_100_vs_10k, difference, count, stagger(100, 100)} | |
81 | set_bench! {is_subset_100_vs_100, is_subset, clone, [pos(100), pos(100)]} | |
82 | set_bench! {is_subset_100_vs_10k, is_subset, clone, [pos(100), pos(10_000)]} | |
83 | set_bench! {is_subset_10k_vs_100, is_subset, clone, [pos(10_000), pos(100)]} | |
84 | set_bench! {is_subset_10k_vs_10k, is_subset, clone, [pos(10_000), pos(10_000)]} |