A Vec of Bits

Added benchmark for 'BitVec::skip(n)' to ensure the new 'nth' is used

+23
+20
benches/bench.rs
··· 260 260 black_box(&mut sieve); 261 261 }); 262 262 } 263 + 264 + #[bench] 265 + fn bench_iter_skip(b: &mut test::Bencher) { 266 + let start = 3 << 20; 267 + let p = 16411; 268 + let g = 9749; // 9749 is a primitive root modulo 16411, so we can generate numbers mod p in a seemingly random order 269 + let end = start + p; 270 + let mut tbl = BitVec::from_elem(end, false); 271 + let mut r = g; 272 + for i in start..end { 273 + tbl.set(i, r&1 != 0); 274 + r = r*g%p; 275 + } 276 + b.iter(|| { 277 + black_box(&mut tbl); 278 + // start is large relative to end-start, so before Iterator::nth was implemented for bitvec this would 279 + // have been much slower 280 + black_box(tbl.iter().skip(start).filter(|&v|v).count()); 281 + }); 282 + }
+3
src/lib.rs
··· 1938 1938 } 1939 1939 1940 1940 fn nth(&mut self, n: usize) -> Option<Self::Item> { 1941 + // This override is used by the compiler to optimize Iterator::skip. 1942 + // Without this, the default implementation of Iterator::nth is used, which walks over 1943 + // the whole iterator up to n. 1941 1944 self.range.nth(n).and_then(|i|self.bit_vec.get(i)) 1942 1945 } 1943 1946