···260260 black_box(&mut sieve);
261261 });
262262}
263263+264264+#[bench]
265265+fn bench_iter_skip(b: &mut test::Bencher) {
266266+ let start = 3 << 20;
267267+ let p = 16411;
268268+ let g = 9749; // 9749 is a primitive root modulo 16411, so we can generate numbers mod p in a seemingly random order
269269+ let end = start + p;
270270+ let mut tbl = BitVec::from_elem(end, false);
271271+ let mut r = g;
272272+ for i in start..end {
273273+ tbl.set(i, r&1 != 0);
274274+ r = r*g%p;
275275+ }
276276+ b.iter(|| {
277277+ black_box(&mut tbl);
278278+ // start is large relative to end-start, so before Iterator::nth was implemented for bitvec this would
279279+ // have been much slower
280280+ black_box(tbl.iter().skip(start).filter(|&v|v).count());
281281+ });
282282+}
+3
src/lib.rs
···19381938 }
1939193919401940 fn nth(&mut self, n: usize) -> Option<Self::Item> {
19411941+ // This override is used by the compiler to optimize Iterator::skip.
19421942+ // Without this, the default implementation of Iterator::nth is used, which walks over
19431943+ // the whole iterator up to n.
19411944 self.range.nth(n).and_then(|i|self.bit_vec.get(i))
19421945 }
19431946