Warum ist eine Schleife über ein Array mit 240+ Elementen in Rust 10-mal langsamer?
Hallo Kollegen. Ich lerne Rust und bin auf ein für mich unerklärliches Verhalten gestoßen. Ich habe einen einfachen Benchmark geschrieben: Ich summiere Array-Elemente in einer `for`-Schleife. Für Arrays mit bis zu 239 Elementen läuft alles blitzschnell (weniger als 1 µs). Sobald die Größe 240 erreicht, steigt die Ausführungszeit sprunghaft auf 10–15 µs. Weiteres Vergrößern der Größe führt zu einem allmählichen Anstieg der Zeit, aber dieser erste Sprung um das 10-fache hat mich verblüfft.
Hier ist der Code, den ich teste:
```rust
use std::time::Instant;
fn sum_array(arr: &[i32]) -> i32 {
let mut sum = 0;
for &x in arr {
sum += x;
}
sum
}
fn main() {
let size = 240;
let arr: Vec = (0..size).collect();
let start = Instant::now();
let _ = sum_array(&arr);
println!("{:?}", start.elapsed());
}
```
Ich kompiliere mit `cargo build --release`. Ich habe versucht, den Elementtyp auf `i64` zu ändern – der Effekt bleibt bestehen. Ich habe verschiedene Größen ausprobiert: 239 – schnell, 240 – langsam. Woran könnte das liegen? Ist das eine Besonderheit von LLVM?