Skip to content

Commit 41cfb68

Browse files
committed
unroll slice::equal impl
1 parent 2624523 commit 41cfb68

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

library/core/src/slice/cmp.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,20 @@ where
6060
return false;
6161
}
6262

63-
self.iter().zip(other.iter()).all(|(x, y)| x == y)
63+
let (chunks_a, residual_a) = self.as_chunks::<4>();
64+
let (chunks_b, residual_b) = other.as_chunks::<4>();
65+
66+
// check the residual first to bail out fast if there's a mismatch and comparisons
67+
// happen to be expensive
68+
let mut result = residual_a.into_iter().zip(residual_b).all(|(a, b)| a == b);
69+
70+
// iter.all short-circuits which means the backend can't unroll the loop due to early exits.
71+
// So we unroll it manually.
72+
result = result && chunks_a.iter().zip(chunks_b.iter()).all(|(a, b)| {
73+
(a[0] == b[0]) & (a[1] == b[1]) & (a[2] == b[2]) & (a[3] == b[3])
74+
});
75+
76+
result
6477
}
6578
}
6679

0 commit comments

Comments
 (0)