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