From 5c819186edb77bd49ccaf8fb61dbc277a05f3aea Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Wed, 3 Sep 2014 18:55:38 +1000 Subject: [PATCH] bitv: add larger tests, better benchmarks & remove dead code. There were no tests for iteration etc. with more than 5 elements, i.e. not even going beyond a single word. This situation is rectified. Also, the only benchmarks for `set` were with a constant bit value, which was not indicative of every situation, due to inlining & branch removal. This adds a benchmark at the other end of the spectrum: random input. --- src/libcollections/bitv.rs | 51 ++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/libcollections/bitv.rs b/src/libcollections/bitv.rs index d13767077c7..0a658c51dbd 100644 --- a/src/libcollections/bitv.rs +++ b/src/libcollections/bitv.rs @@ -95,20 +95,6 @@ fn match_words <'a,'b>(a: &'a Bitv, b: &'b Bitv) -> (MatchWords<'a>, MatchWords< static TRUE: bool = true; static FALSE: bool = false; -#[deriving(Clone)] -struct SmallBitv { - /// only the lowest nbits of this value are used. the rest is undefined. - bits: uint -} - -#[deriving(Clone)] -struct BigBitv { - storage: Vec -} - -#[deriving(Clone)] -enum BitvVariant { Big(BigBitv), Small(SmallBitv) } - /// The bitvector type. /// /// # Example @@ -1653,6 +1639,7 @@ impl<'a> Iterator for TwoBitPositions<'a> { #[cfg(test)] mod tests { use std::prelude::*; + use std::iter::range_step; use std::uint; use std::rand; use std::rand::Rng; @@ -2046,12 +2033,14 @@ mod tests { #[test] fn test_bitv_iterator() { - let bools = [true, false, true, true]; + let bools = vec![true, false, true, true]; let bitv: Bitv = bools.iter().map(|n| *n).collect(); - for (act, &ex) in bitv.iter().zip(bools.iter()) { - assert_eq!(ex, act); - } + assert_eq!(bitv.iter().collect::>(), bools) + + let long = Vec::from_fn(10000, |i| i % 2 == 0); + let bitv: Bitv = long.iter().map(|n| *n).collect(); + assert_eq!(bitv.iter().collect::>(), long) } #[test] @@ -2061,6 +2050,12 @@ mod tests { let idxs: Vec = bitv.iter().collect(); assert_eq!(idxs, vec!(0, 2, 3)); + + let long: BitvSet = range(0u, 10000).map(|n| n % 2 == 0).collect(); + let real = range_step(0, 10000, 2).collect::>(); + + let idxs: Vec = long.iter().collect(); + assert_eq!(idxs, real); } #[test] @@ -2574,7 +2569,7 @@ mod tests { } #[bench] - fn bench_bitv_big(b: &mut Bencher) { + fn bench_bitv_set_big_fixed(b: &mut Bencher) { let mut r = rng(); let mut bitv = Bitv::with_capacity(BENCH_BITS, false); b.iter(|| { @@ -2586,7 +2581,19 @@ mod tests { } #[bench] - fn bench_bitv_small(b: &mut Bencher) { + fn bench_bitv_set_big_variable(b: &mut Bencher) { + let mut r = rng(); + let mut bitv = Bitv::with_capacity(BENCH_BITS, false); + b.iter(|| { + for i in range(0u, 100) { + bitv.set((r.next_u32() as uint) % BENCH_BITS, r.gen()); + } + &bitv + }) + } + + #[bench] + fn bench_bitv_set_small(b: &mut Bencher) { let mut r = rng(); let mut bitv = Bitv::with_capacity(uint::BITS, false); b.iter(|| { @@ -2598,7 +2605,7 @@ mod tests { } #[bench] - fn bench_bitv_set_small(b: &mut Bencher) { + fn bench_bitvset_small(b: &mut Bencher) { let mut r = rng(); let mut bitv = BitvSet::new(); b.iter(|| { @@ -2610,7 +2617,7 @@ mod tests { } #[bench] - fn bench_bitv_set_big(b: &mut Bencher) { + fn bench_bitvset_big(b: &mut Bencher) { let mut r = rng(); let mut bitv = BitvSet::new(); b.iter(|| {