Conversion vers des nombres à virgule flottante : de méga à giga

mardi 23 mars 2021

Convertir des nombres à partir de chaînes de caractères vers des valeurs binaires est une opération commune mais relativement coûteuse.  La conversion d’un seul nombre peut exiger des centaines d’instructions et des douzaines de branches. Les fonctions en C comme strtod peuvent atteindre 200 Mo/s, mais nos disques ont des bandes passantes de plusieurs gigaoctets par seconde. La lecture des nombres devient donc un goulot d’étranglement quand il s’agit de traiter des fichiers FIX, CSV, JSON ou XML contenant beaucoup de valeurs numériques.

Le problème de lecture des nombres requiert de l’arithmétique à précision variable en général. Un nouvel algorithme développé par le professeur Lemire et ses collaborateurs et publié ces derniers mois est plusieurs fois plus rapide que les algorithmes conventionnels. Il permet la lecture des nombres à virgule flottante à plus d’un gigaoctet par seconde. Une mise en oeuvre par le professeur Lemire en C++ se trouve à https://github.com/fastfloat/fast_float L’algorithme fait partie de la librairie standard en Go à partir de la version 1.16: elle a permis de doubler la performance du traitement des nombres dans les cas communs. Un de ses étudiants a développé une version en C# disponible à https://github.com/CarlVerret/csFastFloat Il existe aussi des versions en Rust (https://github.com/aldanor/fast-float-rust/), en R (https://github.com/eddelbuettel/rcppfastfloat) et en Java (https://github.com/wrandelshofer/FastDoubleParser). Une prépublication est disponible à https://arxiv.org/abs/2101.11408