{fmt} kütüphanesinde ikili boyut optimizasyonu
-
{fmt} kütüphanesine giriş
- {fmt}, küçük ikili boyutuyla tanınan bir biçimlendirme kütüphanesidir
- IOStreams, Boost Format, tinyformat vb. ile karşılaştırıldığında, işlev çağrısı başına kod boyutu çok daha küçüktür
- Şablon yükünü en aza indirmek için type erasure kullanır
-
Type erasure ile biçimlendirme
formatişlevi işivformatişlevine devreder- Çıktı yineleyicisi ve diğer çıktı türleri de özel olarak tasarlanmış buffer API'si üzerinden type erasure ile ele alınır
- Şablon kullanımını en aza indirerek ikili boyutu ve derleme süresini azaltır
-
Örnek kod
#include <fmt/base.h> int main() { fmt::print("The answer is {}.", 42); }- Yukarıdaki kod, IOStreams kodundan çok daha küçük bir boyutta derlenir
printfile karşılaştırıldığında da boyut benzerdir ve çalışma zamanında tür güvenliği sağlar
-
İkili boyut optimizasyonu
- 2020'de kütüphane boyutunu 100kB'nin altına indirme çalışması yapıldı
- Güncel sürümün (11.0.2) ikili boyutu 75kB'dir
- Yerel ayar desteği devre dışı bırakılırsa boyut 71kB'ye düşürülebilir
-
Bloaty aracıyla analiz
- Sayı biçimlendirme, özellikle de kayan noktalı sayı biçimlendirme büyük bir pay kaplar
- Kayan nokta desteğine ihtiyaç yoksa bu destek devre dışı bırakılabilir
-
Türe göre biçimlendirme optimizasyonu
FMT_BUILTIN_TYPESmakrosu 0 olarak ayarlanarak yalnızca int türü özel olarak işlenir, diğer türler ise genişletme API'si üzerinden işlenir- Bu yöntemle ikili boyut 31kB'ye düşürülebilir
-
Yerel ayar artefaktlarını kaldırma
FMT_USE_LOCALEmakrosu kullanılarak yerel ayar artefaktları kaldırılırsa boyut 27kB'ye düşürülebilir
-
Hız ile boyut arasındaki trade-off
FMT_OPTIMIZE_SIZEmakrosu ile boyut optimize edildiğinde ikili boyut 23kB'ye düşürülebilir
-
C++ standart kütüphanesi bağımlılığını kaldırma
- İstisnalar devre dışı bırakılıp
-nodefaultlibsseçeneği kullanılarak C++ çalışma zamanı bağımlılığı kaldırılır mallocvefreekullanan özel bir allocator eklenerek ikili boyut 14kB'ye düşürülebilir
- İstisnalar devre dışı bırakılıp
-
Sonucun doğrulanması
lddkomutuyla C++ çalışma zamanı bağımlılığının kaldırıldığı doğrulanır
GN⁺ özeti
- {fmt} küçük ikili boyut ve çalışma zamanında tür güvenliği sunan bir biçimlendirme kütüphanesidir
- Type erasure ve makro ayarlarıyla ikili boyut önemli ölçüde küçültülebilir
- C++ standart kütüphanesi bağımlılığı kaldırılarak gömülü sistemlerde de verimli şekilde kullanılabilir
- Benzer işlevler sunan kütüphaneler arasında IOStreams, Boost Format ve tinyformat bulunur
1 yorum
Hacker News yorumu
mallocvefreekullanmazmallocvefreeçağrılarını kullanmadığı merak ediliyorprintf("Hello, World!\n")ifadesini 1008 baytlık çalıştırılabilir dosya boyutuyla mümkün kılan bir proje varmainfonksiyonuna sahip C programının 6kB olduğu bir sistemde {fmt}, ikili dosyaya 10kB'den daha az ekliyor