Como medir corretamente o desempenho do código em Rust: benchmarking e profiling
Olá, colegas! Escrevo em Rust há cerca de seis meses e me deparei com um problema: não consigo medir adequadamente quanto tempo meu código leva para executar. Tentei usar std::time::Instant, mas os resultados variam de uma execução para outra, especialmente em funções pequenas. Por exemplo, quero comparar duas formas de somar um vetor:
```rust
use std::time::Instant;
fn sum_for(v: &[i32]) -> i32 {
let mut sum = 0;
for x in v { sum += x; }
sum
}
fn sum_iter(v: &[i32]) -> i32 {
v.iter().sum()
}
fn main() {
let data = vec![1; 1_000_000];
let start = Instant::now();
let _ = sum_for(&data);
println!("for: {:?}", start.elapsed());
let start = Instant::now();
let _ = sum_iter(&data);
println!("iter: {:?}", start.elapsed());
}
```
No meu notebook (Ryzen 5, Linux), a primeira medição mostra 0.5-1.2 ms, a segunda 0.3-0.9 ms, e a ordem às vezes muda. Entendo que isso é devido a processos em segundo plano, cache, etc., mas como obter números estáveis?