diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2014-09-03 18:55:38 +1000 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2014-09-03 20:07:08 +1000 |
| commit | 5c819186edb77bd49ccaf8fb61dbc277a05f3aea (patch) | |
| tree | eb096f8175db6b3c7fec2087f641cd0ec74b3c4e | |
| parent | 5dfb7a6ec1c1b7827a1f019b276c4d959cf2d71e (diff) | |
| download | rust-5c819186edb77bd49ccaf8fb61dbc277a05f3aea.tar.gz rust-5c819186edb77bd49ccaf8fb61dbc277a05f3aea.zip | |
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.
| -rw-r--r-- | src/libcollections/bitv.rs | 51 |
1 files 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<uint> -} - -#[deriving(Clone)] -enum BitvVariant { Big(BigBitv), Small(SmallBitv) } - /// The bitvector type. /// /// # Example @@ -1653,6 +1639,7 @@ impl<'a> Iterator<uint> 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::<Vec<bool>>(), 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::<Vec<bool>>(), long) } #[test] @@ -2061,6 +2050,12 @@ mod tests { let idxs: Vec<uint> = 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::<Vec<uint>>(); + + let idxs: Vec<uint> = 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(|| { |
