Consider the following two equivalent functions
fn func_index(vec: &mut Vec::<usize>) {
for i in 0..vec.len() {
vec[i] = i;
}
}
fn func_iter(vec: &mut Vec::<usize>) {
for (i, el) in vec.iter_mut().enumerate() {
*el = i;
}
}
I assumed that rustc is able to see the equivalence and produce the same assembly code for both (at least in release mode). Unfortunately this is not true:
test tests::bench_index ... bench: 4,773 ns/iter (+/- 128)
test tests::bench_iter ... bench: 2,197 ns/iter (+/- 49)
#[bench]
fn bench_index(b: &mut Bencher) {
let mut vec = vec![0; 10000];
b.iter(|| func_index(&mut vec));
}
#[bench]
fn bench_iter(b: &mut Bencher) {
let mut vec = vec![0; 10000];
b.iter(|| func_iter(&mut vec));
}
Does anyone know why rustc is not able to generate the same assembly for both?