Optimierung der Binärgröße der {fmt}-Bibliothek
-
Einführung in die {fmt}-Bibliothek
- {fmt} ist eine Formatierungsbibliothek, die für ihre kleine Binärgröße bekannt ist
- Im Vergleich zu IOStreams, Boost Format, tinyformat usw. ist die Codegröße pro Funktionsaufruf deutlich kleiner
- Durch Type Erasure wird der Template-Overhead minimiert
-
Formatierung durch Type Erasure
- Die Funktion
formatdelegiert die Arbeit an die Funktionvformat - Ausgabe-Iteratoren und andere Ausgabetypen werden ebenfalls über eine speziell entworfene Buffer-API per Type Erasure abstrahiert
- Durch die Minimierung des Template-Einsatzes werden Binärgröße und Build-Zeit reduziert
- Die Funktion
-
Beispielcode
#include <fmt/base.h> int main() { fmt::print("The answer is {}.", 42); }- Der obige Code wird zu einer deutlich kleineren Größe kompiliert als entsprechender IOStreams-Code
- Im Vergleich zu
printfist die Größe ähnlich, zugleich wird Runtime-Typsicherheit geboten
-
Optimierung der Binärgröße
- 2020 wurde daran gearbeitet, die Bibliotheksgröße auf unter 100 kB zu reduzieren
- Die Binärgröße der aktuellen Version (11.0.2) beträgt 75 kB
- Wird die Locale-Unterstützung deaktiviert, lässt sich die Größe auf 71 kB reduzieren
-
Analyse mit dem Tool Bloaty
- Zahlenformatierung, insbesondere die Formatierung von Gleitkommazahlen, macht einen großen Anteil aus
- Wenn keine Unterstützung für Gleitkommazahlen benötigt wird, kann diese deaktiviert werden
-
Optimierung der Formatierung nach Typen
- Durch Setzen des Makros
FMT_BUILTIN_TYPESauf 0 wird nur der Typintspeziell behandelt, während die übrigen Typen über die Erweiterungs-API verarbeitet werden - Mit dieser Methode kann die Binärgröße auf 31 kB reduziert werden
- Durch Setzen des Makros
-
Entfernung von Locale-Artefakten
- Wenn mit dem Makro
FMT_USE_LOCALELocale-Artefakte entfernt werden, lässt sich die Größe auf 27 kB reduzieren
- Wenn mit dem Makro
-
Trade-off zwischen Geschwindigkeit und Größe
- Wird die Größe mit dem Makro
FMT_OPTIMIZE_SIZEoptimiert, kann die Binärgröße auf 23 kB reduziert werden
- Wird die Größe mit dem Makro
-
Entfernung der Abhängigkeit von der C++-Standardbibliothek
- Durch das Deaktivieren von Ausnahmen und die Verwendung der Option
-nodefaultlibswird die Abhängigkeit von der C++-Runtime entfernt - Durch die Einführung eines benutzerdefinierten Allocators mit
mallocundfreekann die Binärgröße auf 14 kB reduziert werden
- Durch das Deaktivieren von Ausnahmen und die Verwendung der Option
-
Überprüfung des Ergebnisses
- Mit dem Befehl
lddwird bestätigt, dass die Abhängigkeit von der C++-Runtime entfernt wurde
- Mit dem Befehl
Zusammenfassung von GN⁺
- Die {fmt}-Bibliothek ist eine Formatierungsbibliothek, die eine kleine Binärgröße und Runtime-Typsicherheit bietet
- Durch Type Erasure und Makro-Konfigurationen lässt sich die Binärgröße erheblich reduzieren
- Durch das Entfernen der Abhängigkeit von der C++-Standardbibliothek lässt sie sich auch in Embedded-Systemen effizient einsetzen
- Bibliotheken mit ähnlicher Funktionalität sind unter anderem IOStreams, Boost Format und tinyformat
1 Kommentare
Hacker-News-Kommentare
mallocundfreemallocundfreeaus libc aufruftprintf(Hello, World!\n")mit einer ausführbaren Dateigröße von 1008 Byte ermöglichtmain-Funktion 6 kB groß ist, fügt {fmt} dem Binärprogramm weniger als 10 kB hinzu