Closed
Description
If I run the following code with rustc -O --test src/slice_equality_slow.rs && ./slice_equality_slow --bench
:
extern crate test;
fn eq<'a, T: PartialEq>(a: &'a [T], b: &'a [T]) -> bool {
if a.len() != b.len() {
return false;
}
for i in range(0, a.len()) {
if a[i] != b[i] {
return false;
}
}
true
}
#[cfg(test)]
mod bench {
use test::Bencher;
#[bench]
fn builtin_eq(b: &mut Bencher) {
let mut u = vec!();
let mut v = vec!();
for i in range(0u, 1_000_000) {
u.push(i);
v.push(i);
}
let x = u.as_slice();
let y = v.as_slice();
b.iter(|| {
assert!(x == y);
})
}
#[bench]
fn custom_eq(b: &mut Bencher) {
let mut u = vec!();
let mut v = vec!();
for i in range(0u, 1_000_000) {
u.push(i);
v.push(i);
}
let x = u.as_slice();
let y = v.as_slice();
b.iter(|| {
assert!(super::eq(x, y));
})
}
}
fn main() {}
Then I get:
running 2 tests
test bench::builtin_eq ... bench: 12513842 ns/iter (+/- 64900)
test bench::custom_eq ... bench: 7303767 ns/iter (+/- 304090)
test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured
I ran into this because I was able to speed up the naive string matching algorithm in core::str
by replacing the slice equality with a for
loop and comparing each component manually.