]>
Commit | Line | Data |
---|---|---|
83c7162d XL |
1 | #![feature(test)] |
2 | ||
3 | extern crate test; | |
4 | extern crate fixedbitset; | |
5 | use test::Bencher; | |
6 | use fixedbitset::{FixedBitSet}; | |
7 | use std::mem::size_of; | |
8 | ||
9 | #[inline] | |
10 | fn iter_ones_using_contains<F: FnMut(usize)>(fb: &FixedBitSet, f: &mut F) { | |
11 | for bit in 0 .. fb.len() { | |
12 | if fb.contains(bit) { | |
13 | f(bit); | |
14 | } | |
15 | } | |
16 | } | |
17 | ||
18 | #[inline] | |
19 | fn iter_ones_using_slice_directly<F: FnMut(usize)>(fb: &FixedBitSet, f: &mut F) { | |
20 | for (block_idx, &block) in fb.as_slice().iter().enumerate() { | |
21 | let mut bit_pos = block_idx * size_of::<u32>() * 8; | |
22 | let mut block: u32 = block; | |
23 | ||
24 | while block != 0 { | |
25 | if (block & 1) == 1 { | |
26 | f(bit_pos); | |
27 | } | |
28 | block = block >> 1; | |
29 | bit_pos += 1; | |
30 | } | |
31 | } | |
32 | } | |
33 | ||
34 | #[bench] | |
35 | fn bench_iter_ones_using_contains_all_zeros(b: &mut Bencher) { | |
36 | const N: usize = 1_000_000; | |
37 | let fb = FixedBitSet::with_capacity(N); | |
38 | ||
39 | b.iter(|| { | |
40 | let mut count = 0; | |
41 | iter_ones_using_contains(&fb, &mut |_bit| count += 1); | |
42 | count | |
43 | }); | |
44 | } | |
45 | ||
46 | #[bench] | |
47 | fn bench_iter_ones_using_contains_all_ones(b: &mut Bencher) { | |
48 | const N: usize = 1_000_000; | |
49 | let mut fb = FixedBitSet::with_capacity(N); | |
50 | fb.insert_range(..); | |
51 | ||
52 | b.iter(|| { | |
53 | let mut count = 0; | |
54 | iter_ones_using_contains(&fb, &mut |_bit| count += 1); | |
55 | count | |
56 | }); | |
57 | } | |
58 | ||
59 | #[bench] | |
60 | fn bench_iter_ones_using_slice_directly_all_zero(b: &mut Bencher) { | |
61 | const N: usize = 1_000_000; | |
62 | let fb = FixedBitSet::with_capacity(N); | |
63 | ||
64 | b.iter(|| { | |
65 | let mut count = 0; | |
66 | iter_ones_using_slice_directly(&fb, &mut |_bit| count += 1); | |
67 | count | |
68 | }); | |
69 | } | |
70 | ||
71 | #[bench] | |
72 | fn bench_iter_ones_using_slice_directly_all_ones(b: &mut Bencher) { | |
73 | const N: usize = 1_000_000; | |
74 | let mut fb = FixedBitSet::with_capacity(N); | |
75 | fb.insert_range(..); | |
76 | ||
77 | b.iter(|| { | |
78 | let mut count = 0; | |
79 | iter_ones_using_slice_directly(&fb, &mut |_bit| count += 1); | |
80 | count | |
81 | }); | |
82 | } | |
83 | ||
84 | #[bench] | |
85 | fn bench_iter_ones_all_zeros(b: &mut Bencher) { | |
86 | const N: usize = 1_000_000; | |
87 | let fb = FixedBitSet::with_capacity(N); | |
88 | ||
89 | b.iter(|| { | |
90 | let mut count = 0; | |
91 | for _ in fb.ones() { | |
92 | count += 1; | |
93 | } | |
94 | count | |
95 | }); | |
96 | } | |
97 | ||
98 | #[bench] | |
99 | fn bench_iter_ones_all_ones(b: &mut Bencher) { | |
100 | const N: usize = 1_000_000; | |
101 | let mut fb = FixedBitSet::with_capacity(N); | |
102 | fb.insert_range(..); | |
103 | ||
104 | b.iter(|| { | |
105 | let mut count = 0; | |
106 | for _ in fb.ones() { | |
107 | count += 1; | |
108 | } | |
109 | count | |
110 | }); | |
111 | } | |
112 | ||
113 | #[bench] | |
114 | fn bench_insert_range(b: &mut Bencher) { | |
115 | const N: usize = 1_000_000; | |
116 | let mut fb = FixedBitSet::with_capacity(N); | |
117 | ||
118 | b.iter(|| { | |
119 | fb.insert_range(..) | |
120 | }); | |
121 | } | |
122 | ||
123 | #[bench] | |
124 | fn bench_insert_range_using_loop(b: &mut Bencher) { | |
125 | const N: usize = 1_000_000; | |
126 | let mut fb = FixedBitSet::with_capacity(N); | |
127 | ||
128 | b.iter(|| { | |
129 | for i in 0..N { | |
130 | fb.insert(i); | |
131 | } | |
132 | }); | |
133 | } |