Open
Description
Greetings!
I'd like to report that I get some significant (negative) performance impact when calling step_by(1)
on an iterator. I created a repository with a detailed description of the issue and benchmarks to reproduce it: https://github.com/mvlabat/step_by_one
These are the functions I tested:
pub fn iter_default_step(mut arr: Vec<i32>) -> Vec<i32> {
for e in arr.iter_mut() {
*e = e.wrapping_add(3);
}
arr
}
pub fn iter_step(mut arr: Vec<i32>, iter_step: usize) -> Vec<i32> {
for e in arr.iter_mut().step_by(iter_step) {
*e = e.wrapping_add(3);
}
arr
}
Calling iter_step(vec![1; LARGE_ENOUGH], 1)
computes 1.75x slower than iter_default_step(vec![1; LARGE_ENOUGH])
with const LARGE_ENOUGH: usize = 10_000_000;
.
I'm running Macbook Pro 2015 with Intel i5-5257U CPU (2.70GHz).
My rustc version: 1.33.0-nightly (c2d381d39 2019-01-10)
.
These are the exact benchmark results I got:
running 4 tests
test tests::bench_iter_default_step ... bench: 8,702,963 ns/iter (+/- 1,648,782)
test tests::bench_iter_step_1 ... bench: 15,267,083 ns/iter (+/- 1,236,220)
test tests::bench_iter_step_16 ... bench: 9,053,772 ns/iter (+/- 380,422)
test tests::bench_iter_step_64 ... bench: 8,711,169 ns/iter (+/- 327,562)
In the repository README there are also links to the generated asm code of these two functions.