Optimización del tamaño binario de la biblioteca {fmt}
-
Introducción a la biblioteca {fmt}
- {fmt} es una biblioteca de formateo conocida por su pequeño tamaño binario
- En comparación con IOStreams, Boost Format, tinyformat y otras, el tamaño de código por llamada de función es mucho menor
- Minimiza la sobrecarga de plantillas mediante borrado de tipos (type erasure)
-
Formateo mediante borrado de tipos
- La función
formatdelega el trabajo a la funciónvformat - El iterador de salida y otros tipos de salida también se borran en cuanto a tipo mediante una API de búfer diseñada especialmente
- Al minimizar el uso de plantillas, se reducen el tamaño binario y el tiempo de compilación
- La función
-
Código de ejemplo
#include <fmt/base.h> int main() { fmt::print("The answer is {}.", 42); }- El código anterior se compila con un tamaño mucho menor que el código con IOStreams
- Incluso en comparación con
printf, el tamaño es similar y ofrece seguridad de tipos en tiempo de ejecución
-
Optimización del tamaño binario
- En 2020 se realizó un trabajo para reducir el tamaño de la biblioteca a menos de 100 kB
- El tamaño binario de la versión más reciente (11.0.2) es de 75 kB
- Si se desactiva el soporte de locale, el tamaño puede reducirse a 71 kB
-
Análisis con la herramienta Bloaty
- El formateo de números, especialmente el de números de punto flotante, ocupa una gran parte
- Si no se necesita soporte para punto flotante, puede desactivarse
-
Optimización del formateo por tipo
- Configurando la macro
FMT_BUILTIN_TYPESen 0, solo el tipo int se maneja de forma especial y el resto de los tipos se procesan mediante la API de extensión - Con este método, el tamaño binario puede reducirse a 31 kB
- Configurando la macro
-
Eliminación de artefactos de locale
- Usando la macro
FMT_USE_LOCALEpara eliminar artefactos de locale, el tamaño puede reducirse a 27 kB
- Usando la macro
-
Compensación entre velocidad y tamaño
- Al optimizar el tamaño con la macro
FMT_OPTIMIZE_SIZE, el binario puede reducirse a 23 kB
- Al optimizar el tamaño con la macro
-
Eliminación de la dependencia de la biblioteca estándar de C++
- Se desactivan las excepciones y se usa la opción
-nodefaultlibspara eliminar la dependencia del runtime de C++ - Introduciendo un asignador personalizado que usa
mallocyfree, el tamaño binario puede reducirse a 14 kB
- Se desactivan las excepciones y se usa la opción
-
Verificación del resultado
- Se confirma con el comando
lddque se eliminó la dependencia del runtime de C++
- Se confirma con el comando
Resumen de GN⁺
- La biblioteca {fmt} es una biblioteca de formateo que ofrece un tamaño binario pequeño y seguridad de tipos en tiempo de ejecución
- Mediante borrado de tipos y configuración de macros, es posible reducir significativamente el tamaño binario
- Al eliminar la dependencia de la biblioteca estándar de C++, puede usarse de forma eficiente incluso en sistemas embebidos
- Algunas bibliotecas con funciones similares son IOStreams, Boost Format y tinyformat
1 comentarios
Opiniones en Hacker News
mallocnifreemallocyfreede libcprintf(Hello, World!\n")con un ejecutable de 1008 bytesmainvacía ocupa 6 kB, {fmt} agrega menos de 10 kB al binariofmtsiempre causa problemas