Skip to content

Commit dd70530

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

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

src/iter/while_some.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,26 @@ where
122122
self
123123
}
124124

125+
fn consume_iter<I>(mut self, iter: I) -> Self
126+
where I: IntoIterator<Item = Option<T>>
127+
{
128+
let full = self.full;
129+
self.base = self.base.consume_iter(
130+
iter.into_iter()
131+
.take_while(|x| {
132+
match *x {
133+
Some(_) => !full.load(Ordering::Relaxed),
134+
None => {
135+
full.store(true, Ordering::Relaxed);
136+
false
137+
}
138+
}
139+
})
140+
.map(|x| x.unwrap())
141+
);
142+
self
143+
}
144+
125145
fn complete(self) -> C::Result {
126146
self.base.complete()
127147
}

0 commit comments

Comments
 (0)