You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Check full in fold & find_anyconsume_iter, remove for filter*
These adaptors consume may many elements before deferring to a base
folder's fullness checks, and so they need to be performed
manually. For the `filter`s, there's no way to do it manually (rayon-rs#632),
so the specialisations just have to be removed. For `fold` and
`find_any` this can be done with a `take_while`.
This extends the octillion tests to confirm this behaviour.
This makes a program like the following slightly slower compared to
the direct `consume_iter` without a check, but it's still faster than
the non-specialized form.
```
extern crate test;
extern crate rayon;
use rayon::prelude::*;
fn main() {
let count = (0..std::u32::MAX)
.into_par_iter()
.map(test::black_box)
.find_any(|_| test::black_box(false));
println!("{:?}", count);
}
```
```
$ hyperfine ./find-original ./find-no-check ./find-check
Benchmark #1: ./find-original
Time (mean ± σ): 627.6 ms ± 25.7 ms [User: 7.130 s, System: 0.014 s]
Range (min … max): 588.4 ms … 656.4 ms 10 runs
Benchmark #2: ./find-no-check
Time (mean ± σ): 481.5 ms ± 10.8 ms [User: 5.415 s, System: 0.013 s]
Range (min … max): 468.9 ms … 498.2 ms 10 runs
Benchmark #3: ./find-check
Time (mean ± σ): 562.3 ms ± 11.8 ms [User: 6.363 s, System: 0.013 s]
Range (min … max): 542.5 ms … 578.2 ms 10 runs
```
(find-original = without specialization, find-no-check = custom
`consume_iter` without `take_while`, find-check = this commit)
0 commit comments