Tối ưu kích thước nhị phân của thư viện {fmt}
-
Giới thiệu về thư viện {fmt}
- {fmt} là một thư viện định dạng nổi tiếng với kích thước nhị phân nhỏ
- So với IOStreams, Boost Format, tinyformat, v.v., kích thước mã trên mỗi lần gọi hàm nhỏ hơn nhiều
- Giảm thiểu gánh nặng template thông qua type erasure
-
Định dạng thông qua type erasure
- Hàm
formatủy quyền công việc cho hàmvformat - Iterator đầu ra và các kiểu đầu ra khác cũng được type erasure thông qua API buffer được thiết kế riêng
- Giảm thiểu việc sử dụng template để giảm kích thước nhị phân và thời gian build
- Hàm
-
Mã ví dụ
#include <fmt/base.h> int main() { fmt::print("The answer is {}.", 42); }- Đoạn mã trên được biên dịch với kích thước nhỏ hơn nhiều so với mã IOStreams
- So với
printf, kích thước cũng tương đương nhưng cung cấp type safety ở runtime
-
Tối ưu kích thước nhị phân
- Năm 2020, tác giả đã thực hiện công việc giảm kích thước thư viện xuống dưới 100kB
- Kích thước nhị phân của phiên bản mới nhất (11.0.2) là 75kB
- Có thể giảm xuống 71kB nếu tắt hỗ trợ locale
-
Phân tích bằng công cụ Bloaty
- Định dạng số, đặc biệt là định dạng số dấu phẩy động, chiếm phần lớn dung lượng
- Nếu không cần hỗ trợ số dấu phẩy động thì có thể vô hiệu hóa phần này
-
Tối ưu định dạng theo từng kiểu
- Đặt macro
FMT_BUILTIN_TYPESthành 0 để chỉ xử lý đặc biệt kiểu int, còn các kiểu khác được xử lý qua API mở rộng - Với cách này, có thể giảm kích thước nhị phân xuống 31kB
- Đặt macro
-
Loại bỏ artifact locale
- Dùng macro
FMT_USE_LOCALEđể loại bỏ các artifact locale, từ đó giảm kích thước xuống 27kB
- Dùng macro
-
Đánh đổi giữa tốc độ và kích thước
- Dùng macro
FMT_OPTIMIZE_SIZEđể tối ưu cho kích thước, có thể giảm kích thước nhị phân xuống 23kB
- Dùng macro
-
Loại bỏ phụ thuộc vào thư viện chuẩn C++
- Vô hiệu hóa exception và dùng tùy chọn
-nodefaultlibsđể loại bỏ phụ thuộc vào runtime C++ - Giới thiệu custom allocator dùng
mallocvàfreeđể giảm kích thước nhị phân xuống 14kB
- Vô hiệu hóa exception và dùng tùy chọn
-
Xác nhận kết quả
- Dùng lệnh
lddđể xác nhận rằng phụ thuộc runtime C++ đã được loại bỏ
- Dùng lệnh
Tóm tắt của GN⁺
- Thư viện {fmt} là một thư viện định dạng cung cấp kích thước nhị phân nhỏ và type safety ở runtime
- Có thể giảm mạnh kích thước nhị phân thông qua type erasure và các thiết lập macro
- Việc loại bỏ phụ thuộc vào thư viện chuẩn C++ giúp sử dụng hiệu quả cả trên các hệ thống nhúng
- Các thư viện cung cấp tính năng tương tự gồm có IOStreams, Boost Format, tinyformat, v.v.
1 bình luận
Ý kiến trên Hacker News
{fmt}về cơ bản là độc lập với localemallocvàfreemallocvàfreecủa libcprintf("Hello, World!\n")với kích thước tệp thực thi là 1008 bytemainrỗng có kích thước 6kB,{fmt}thêm chưa đến 10kB vào nhị phânfmtlúc nào cũng gây ra vấn đề