Skip to content

Commit cabe301

Browse files
committed
Specialize consume_iter for IntersperseFolder
Part of rayon-rs#465. This makes the following program 10x faster (5.7s before, 0.55s after) on a 6 core (12 thread) machine. ``` extern crate test; extern crate rayon; use rayon::prelude::*; fn main() { let count = (0..std::u32::MAX) .into_par_iter() .intersperse(1) .map(test::black_box) .count(); println!("{}", count); } ```
1 parent dd70530 commit cabe301

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

src/iter/intersperse.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::plumbing::*;
22
use super::*;
33
use std::cell::Cell;
4-
use std::iter::Fuse;
4+
use std::iter::{self, Fuse};
55

66
/// `Intersperse` is an iterator that inserts a particular item between each
77
/// item of the adapted iterator. This struct is created by the
@@ -382,6 +382,30 @@ where
382382
self
383383
}
384384

385+
fn consume_iter<I>(self, iter: I) -> Self
386+
where I: IntoIterator<Item = T>
387+
{
388+
let mut clone_first = self.clone_first;
389+
let between_item = self.item;
390+
let base = self.base.consume_iter(
391+
iter.into_iter()
392+
.flat_map(|item| {
393+
let first = if clone_first {
394+
Some(between_item.clone())
395+
} else {
396+
clone_first = true;
397+
None
398+
};
399+
first.into_iter().chain(iter::once(item))
400+
})
401+
);
402+
IntersperseFolder {
403+
base: base,
404+
item: between_item,
405+
clone_first: clone_first,
406+
}
407+
}
408+
385409
fn complete(self) -> C::Result {
386410
self.base.complete()
387411
}

0 commit comments

Comments
 (0)