@@ -3,86 +3,86 @@ use std::collections::BTreeSet;
33use rand:: { thread_rng, Rng } ;
44use test:: { black_box, Bencher } ;
55
6- fn random ( n1 : u32 , n2 : u32 ) -> [ BTreeSet < usize > ; 2 ] {
6+ fn random ( n : usize ) -> BTreeSet < usize > {
77 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 ( ) ) ;
1311 }
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
1914}
2015
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) ;
2920 }
30- [ even, odd]
21+ assert_eq ! ( set. len( ) , n) ;
22+ set
3123}
3224
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) ;
4129 }
42- [ neg, pos]
30+ assert_eq ! ( set. len( ) , n) ;
31+ set
4332}
4433
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 ) ;
5341 }
54- [ pos, neg]
42+ assert_eq ! ( sets[ 0 ] . len( ) , n1) ;
43+ assert_eq ! ( sets[ 1 ] . len( ) , n2) ;
44+ sets
5545}
5646
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) => {
5949 #[ bench]
6050 pub fn $name( b: & mut Bencher ) {
6151 // setup
6252 let sets = $sets;
6353
6454 // measure
6555 b. iter( || {
66- let x = sets[ 0 ] . intersection ( & sets[ 1 ] ) . count ( ) ;
56+ let x = sets[ 0 ] . $set_func ( & sets[ 1 ] ) . $result_func ( ) ;
6757 black_box( x) ;
6858 } )
6959 }
7060 } ;
7161}
7262
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