diff options
| author | Björn Steinbrink <bsteinbr@gmail.com> | 2015-07-08 14:49:55 +0200 |
|---|---|---|
| committer | Björn Steinbrink <bsteinbr@gmail.com> | 2015-07-08 14:49:55 +0200 |
| commit | 9f4d5b4be10ce9683569a0bd55f555d30f70b5a5 (patch) | |
| tree | fcae4b51321a5c16d61fc376191d1beef4a53670 /src/libcore | |
| parent | 7b7853897ba1469d7bb47fb6e4b877b6741fbb4b (diff) | |
| download | rust-9f4d5b4be10ce9683569a0bd55f555d30f70b5a5.tar.gz rust-9f4d5b4be10ce9683569a0bd55f555d30f70b5a5.zip | |
Improve PartialEq for slices
Exploiting the fact that getting the length of the slices is known, we can use a counted loop instead of iterators, which means that we only need a single counter, instead of having to increment and check one pointer for each iterator. Benchmarks comparing vectors with 100,000 elements: Before: ``` running 8 tests test eq1_u8 ... bench: 66,757 ns/iter (+/- 113) test eq2_u16 ... bench: 111,267 ns/iter (+/- 149) test eq3_u32 ... bench: 126,282 ns/iter (+/- 111) test eq4_u64 ... bench: 126,418 ns/iter (+/- 155) test ne1_u8 ... bench: 88,990 ns/iter (+/- 161) test ne2_u16 ... bench: 89,126 ns/iter (+/- 265) test ne3_u32 ... bench: 96,901 ns/iter (+/- 92) test ne4_u64 ... bench: 96,750 ns/iter (+/- 137) ``` After: ``` running 8 tests test eq1_u8 ... bench: 46,413 ns/iter (+/- 521) test eq2_u16 ... bench: 46,500 ns/iter (+/- 74) test eq3_u32 ... bench: 50,059 ns/iter (+/- 92) test eq4_u64 ... bench: 54,001 ns/iter (+/- 92) test ne1_u8 ... bench: 47,595 ns/iter (+/- 53) test ne2_u16 ... bench: 47,521 ns/iter (+/- 59) test ne3_u32 ... bench: 44,889 ns/iter (+/- 74) test ne4_u64 ... bench: 47,775 ns/iter (+/- 68) ```
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/slice.rs | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index a8c995f37cc..78cda8c2c72 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -1459,12 +1459,30 @@ pub mod bytes { #[stable(feature = "rust1", since = "1.0.0")] impl<A, B> PartialEq<[B]> for [A] where A: PartialEq<B> { fn eq(&self, other: &[B]) -> bool { - self.len() == other.len() && - order::eq(self.iter(), other.iter()) + if self.len() != other.len() { + return false; + } + + for i in 0..self.len() { + if !self[i].eq(&other[i]) { + return false; + } + } + + true } fn ne(&self, other: &[B]) -> bool { - self.len() != other.len() || - order::ne(self.iter(), other.iter()) + if self.len() != other.len() { + return true; + } + + for i in 0..self.len() { + if self[i].ne(&other[i]) { + return true; + } + } + + false } } |
