Réductions

Les itérateurs Rust fournissent de nombreuses méthodes de réduction, comme sum() :

#![allow(unused)]
fn main() {
let numbers = [4.2; 10];
println!("Before: {numbers:?}");

let sum = numbers.into_iter()
                 .sum::<f32>();
println!("After: {sum:?}");
}

Mais ces réductions font l’équivalent d’une boucle simple, dans le cas de sum()

#![allow(unused)]
fn main() {
let numbers = [4.2; 10];
let mut sum = 0.0f32;
for x in numbers {
    sum += x;
}
}

Elles ont donc une mauvaise performance en virgule flottante :( Pour faire mieux, on peut :

  • Augmenter le parallélisme d’instruction (cf std::reduce de C++20, iterator_ilp en Rust…)
  • Arrêter de jouer aux dés avec le compilateur et passer au SIMD explicite