diff options
| author | bors <bors@rust-lang.org> | 2014-09-04 01:11:04 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-09-04 01:11:04 +0000 |
| commit | d59d97cbec6807166bc237d6f3f9bd1eeb5288d7 (patch) | |
| tree | 4f7d59c5e80c4ec2fb1fd58d1eecf7f366b4b554 | |
| parent | a4d257b1500e8853d093f8ba38dc9561ad242f71 (diff) | |
| parent | 5c819186edb77bd49ccaf8fb61dbc277a05f3aea (diff) | |
| download | rust-d59d97cbec6807166bc237d6f3f9bd1eeb5288d7.tar.gz rust-d59d97cbec6807166bc237d6f3f9bd1eeb5288d7.zip | |
auto merge of #16961 : huonw/rust/bitv-twiddle, r=alexcrichton
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(|| { |
