Skip to content

Commit

Permalink
Use the slice length to hint the optimizer
Browse files Browse the repository at this point in the history
Using the len of the iterator doesn't give the same result.
That's also why we can't generalize it to all TrustedLen iterators.
  • Loading branch information
arthurprs committed Jan 26, 2018
1 parent 0b56ab0 commit 4f7109a
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/libcore/slice/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1223,7 +1223,8 @@ macro_rules! iterator {
P: FnMut(Self::Item) -> bool,
{
// The addition might panic on overflow
let n = self.len();
// Use the len of the slice to hint optimizer to remove result index bounds check.
let n = make_slice!(self.ptr, self.end).len();
self.try_fold(0, move |i, x| {
if predicate(x) { Err(i) }
else { Ok(i + 1) }
Expand All @@ -1241,7 +1242,8 @@ macro_rules! iterator {
{
// No need for an overflow check here, because `ExactSizeIterator`
// implies that the number of elements fits into a `usize`.
let n = self.len();
// Use the len of the slice to hint optimizer to remove result index bounds check.
let n = make_slice!(self.ptr, self.end).len();
self.try_rfold(n, move |i, x| {
let i = i - 1;
if predicate(x) { Err(i) }
Expand Down

0 comments on commit 4f7109a

Please sign in to comment.