Ce qui se passe
Rust 1.98.0 est disponible en stable. Mise à jour habituelle via
rustup update stable. Deux ajouts de bibliothèque standard méritent l'attention
pour qui travaille la performance.
Les méthodes algébriques sur les flottants
Les types f32 et f64 reçoivent des méthodes dites algébriques pour
l'addition, la soustraction, la multiplication, la division et le reste.
Leur raison d'être demande un détour par une propriété contre-intuitive :
l'addition flottante n'est pas associative. Une somme comme a + b + c + d
doit donc être évaluée dans l'ordre d'écriture, en associant à gauche —
((a + b) + c) + d — car regrouper autrement peut changer le résultat.
Ces méthodes lèvent cette contrainte. Elles autorisent le compilateur à optimiser
en s'appuyant sur les propriétés des nombres réels, même si ces propriétés ne
tiennent pas avec les limites de la représentation flottante. Le compilateur
peut alors réordonner la somme, par exemple en (a + b) + (c + d), et évaluer
les sommes partielles simultanément.
Le gain principal n'est d'ailleurs pas là : c'est la vectorisation des boucles, souvent débloquée par ces méthodes.
L'ensemble exact des optimisations n'est pas spécifié, et la documentation le
compare à ce qu'on obtient avec l'option -ffast-math d'autres langages.
Le compromis est explicite. Ces méthodes sont non déterministes, puisque le compilateur reste libre de ses choix d'une compilation à l'autre. En revanche — et c'est la garantie qui compte en Rust — elles ne provoquent jamais de comportement indéfini.
Le formatage d'entiers sur tampon
Tous les types entiers primitifs reçoivent une méthode format_into, qui prend
en paramètre un tampon dimensionné pour contenir la forme décimale de n'importe
quelle valeur du type. Le tampon reste opaque, et la méthode renvoie la chaîne
formatée, empruntée à ce tampon.
L'intérêt est de court-circuiter l'essentiel de la répartition dynamique
qu'implique un formatage classique par macro. Les mesures publiées dans le dépôt
de référence sur le sujet placent format_into au niveau de la bibliothèque
itoa elle-même — au point de pouvoir la remplacer, ainsi que ses équivalentes.
À retenir
Deux optimisations obtenues sans quitter le code sûr : l'une en autorisant explicitement le compilateur à réordonner du calcul flottant, l'autre en supprimant une indirection sur un chemin très fréquenté.
Source : Rust Blog