Optimisation de la taille du binaire de la bibliothèque {fmt}
-
Présentation de la bibliothèque {fmt}
- {fmt} est une bibliothèque de formatage réputée pour la petite taille de ses binaires
- Par rapport à IOStreams, Boost Format, tinyformat, etc., la taille du code par appel de fonction est bien plus faible
- Elle minimise la surcharge des templates grâce à l'effacement de type (
type erasure)
-
Formatage via l'effacement de type
- La fonction
formatdélègue le travail à la fonctionvformat - L'itérateur de sortie et les autres types de sortie sont eux aussi effacés via une API de buffer spécialement conçue
- L'utilisation minimale des templates réduit la taille du binaire et le temps de compilation
- La fonction
-
Exemple de code
#include <fmt/base.h> int main() { fmt::print("The answer is {}.", 42); }- Le code ci-dessus se compile en un binaire bien plus petit que du code basé sur IOStreams
- Même comparé à
printf, la taille reste similaire tout en offrant la sûreté de type à l'exécution
-
Optimisation de la taille du binaire
- En 2020, un travail a été mené pour ramener la taille de la bibliothèque sous les 100 kB
- La taille du binaire de la version récente (11.0.2) est de 75 kB
- En désactivant la prise en charge des locales, la taille peut être réduite à 71 kB
-
Analyse avec l'outil Bloaty
- Le formatage des nombres, en particulier des nombres à virgule flottante, occupe une part importante
- Si la prise en charge des flottants n'est pas nécessaire, elle peut être désactivée
-
Optimisation du formatage par type
- En définissant la macro
FMT_BUILTIN_TYPESà 0, seul le type int est traité de manière spéciale, et les autres types passent par l'API d'extension - Cette méthode permet de réduire la taille du binaire à 31 kB
- En définissant la macro
-
Suppression des artefacts liés aux locales
- En utilisant la macro
FMT_USE_LOCALEpour supprimer les artefacts liés aux locales, la taille peut être réduite à 27 kB
- En utilisant la macro
-
Compromis entre vitesse et taille
- En utilisant la macro
FMT_OPTIMIZE_SIZEpour optimiser la taille, le binaire peut être ramené à 23 kB
- En utilisant la macro
-
Suppression de la dépendance à la bibliothèque standard C++
- En désactivant les exceptions et en utilisant l'option
-nodefaultlibs, la dépendance au runtime C++ est supprimée - L'introduction d'un allocateur personnalisé utilisant
mallocetfreepermet de réduire la taille du binaire à 14 kB
- En désactivant les exceptions et en utilisant l'option
-
Vérification du résultat
- La commande
lddpermet de confirmer que la dépendance au runtime C++ a bien été supprimée
- La commande
Résumé de GN⁺
- La bibliothèque {fmt} est une bibliothèque de formatage offrant une petite taille de binaire et la sûreté de type à l'exécution
- L'effacement de type et la configuration de macros permettent de réduire fortement la taille du binaire
- La suppression de la dépendance à la bibliothèque standard C++ permet une utilisation efficace même sur des systèmes embarqués
- Parmi les bibliothèques offrant des fonctions similaires, on trouve IOStreams, Boost Format et tinyformat
1 commentaires
Avis Hacker News
mallocetfreemallocetfreede libcprintf(Hello, World!\n")avec un exécutable de 1008 octetsmainvide fait 6 kB, {fmt} ajoute moins de 10 kB au binairefmtpose toujours problème