Optimasi ukuran biner library {fmt}
-
Pengenalan library {fmt}
- {fmt} adalah library formatting yang dikenal memiliki ukuran biner kecil
- Dibandingkan dengan IOStreams, Boost Format, tinyformat, dan lainnya, ukuran kode per pemanggilan fungsi jauh lebih kecil
- Beban template diminimalkan melalui type erasure
-
Formatting melalui type erasure
- Fungsi
formatmendelegasikan pekerjaannya ke fungsivformat - Iterator output dan tipe output lain juga dihapus tipenya melalui API buffer yang dirancang khusus
- Penggunaan template diminimalkan untuk mengurangi ukuran biner dan waktu build
- Fungsi
-
Contoh kode
#include <fmt/base.h> int main() { fmt::print("The answer is {}.", 42); }- Kode di atas dikompilasi dengan ukuran yang jauh lebih kecil dibanding kode IOStreams
- Bahkan dibandingkan dengan
printf, ukurannya serupa sambil tetap memberikan type safety saat runtime
-
Optimasi ukuran biner
- Pada 2020, dilakukan pekerjaan untuk menurunkan ukuran library hingga di bawah 100kB
- Ukuran biner versi terbaru (11.0.2) adalah 75kB
- Jika dukungan locale dinonaktifkan, ukurannya bisa diturunkan menjadi 71kB
-
Analisis menggunakan alat Bloaty
- Formatting angka, terutama formatting angka floating-point, memakan porsi besar
- Jika dukungan floating-point tidak dibutuhkan, fitur ini bisa dinonaktifkan
-
Optimasi formatting per tipe
- Setel makro
FMT_BUILTIN_TYPESke 0 agar hanya tipe int yang ditangani secara khusus dan tipe lainnya diproses melalui API ekstensi - Dengan cara ini, ukuran biner bisa diturunkan menjadi 31kB
- Setel makro
-
Menghapus artefak locale
- Menggunakan makro
FMT_USE_LOCALEuntuk menghapus artefak locale dapat menurunkan ukuran menjadi 27kB
- Menggunakan makro
-
Trade-off antara kecepatan dan ukuran
- Menggunakan makro
FMT_OPTIMIZE_SIZEuntuk mengoptimalkan ukuran dapat menurunkan ukuran biner menjadi 23kB
- Menggunakan makro
-
Menghapus dependensi library standar C++
- Menonaktifkan exception dan menggunakan opsi
-nodefaultlibsuntuk menghapus dependensi runtime C++ - Dengan memperkenalkan allocator kustom yang menggunakan
mallocdanfree, ukuran biner bisa diturunkan menjadi 14kB
- Menonaktifkan exception dan menggunakan opsi
-
Verifikasi hasil
- Menggunakan perintah
ldduntuk memastikan bahwa dependensi runtime C++ telah dihapus
- Menggunakan perintah
Ringkasan GN⁺
- Library {fmt} adalah library formatting yang menawarkan ukuran biner kecil dan type safety saat runtime
- Melalui type erasure dan pengaturan makro, ukuran biner dapat dikurangi secara signifikan
- Dengan menghapus dependensi library standar C++, library ini dapat digunakan secara efisien bahkan pada sistem embedded
- Library dengan fungsi serupa antara lain IOStreams, Boost Format, dan tinyformat
1 komentar
Komentar Hacker News
printf("Hello, World!\n")dengan ukuran file eksekusi 1008 bytemainkosong berukuran 6 kB, {fmt} menambahkan kurang dari 10 kB ke biner