Skip to content

Commit 40cf58c

Browse files
bors[bot]fyrchik
andauthored
Merge #342
342: make all_equal() faster r=jswrenn a=fyrchik Hello! This PR adresses #282 issue. Variant with `dedup` does not short circuit, but one with `all` does. I have also added some benchmarks and test for an empty iterator. ``` test all_equal ... bench: 999,832 ns/iter (+/- 217,245) test all_equal_default ... bench: 4,814,277 ns/iter (+/- 315,335) test all_equal_for ... bench: 2,096,174 ns/iter (+/- 165,596) ``` Let me know, what do you think. Co-authored-by: Evgenii <[email protected]>
2 parents 32b4d3e + 99002dd commit 40cf58c

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed

benches/bench1.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,3 +731,34 @@ fn cartesian_product_nested_for(b: &mut test::Bencher)
731731
sum
732732
})
733733
}
734+
735+
#[bench]
736+
fn all_equal(b: &mut test::Bencher) {
737+
let mut xs = vec![0; 5_000_000];
738+
xs.extend(vec![1; 5_000_000]);
739+
740+
b.iter(|| xs.iter().all_equal())
741+
}
742+
743+
#[bench]
744+
fn all_equal_for(b: &mut test::Bencher) {
745+
let mut xs = vec![0; 5_000_000];
746+
xs.extend(vec![1; 5_000_000]);
747+
748+
b.iter(|| {
749+
for &x in &xs {
750+
if x != xs[0] {
751+
return false;
752+
}
753+
}
754+
true
755+
})
756+
}
757+
758+
#[bench]
759+
fn all_equal_default(b: &mut test::Bencher) {
760+
let mut xs = vec![0; 5_000_000];
761+
xs.extend(vec![1; 5_000_000]);
762+
763+
b.iter(|| xs.iter().dedup().nth(1).is_none())
764+
}

src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,9 +1380,13 @@ pub trait Itertools : Iterator {
13801380
/// assert!(data.into_iter().all_equal());
13811381
/// ```
13821382
fn all_equal(&mut self) -> bool
1383-
where Self::Item: PartialEq,
1383+
where Self: Sized,
1384+
Self::Item: PartialEq,
13841385
{
1385-
self.dedup().nth(1).is_none()
1386+
match self.next() {
1387+
None => true,
1388+
Some(a) => self.all(|x| a == x),
1389+
}
13861390
}
13871391

13881392
/// Consume the first `n` elements from the iterator eagerly,

tests/test_std.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ fn dedup_by() {
116116

117117
#[test]
118118
fn all_equal() {
119+
assert!("".chars().all_equal());
120+
assert!("A".chars().all_equal());
119121
assert!(!"AABBCCC".chars().all_equal());
120122
assert!("AAAAAAA".chars().all_equal());
121123
for (_key, mut sub) in &"AABBCCC".chars().group_by(|&x| x) {

0 commit comments

Comments
 (0)