การเพิ่มประสิทธิภาพขนาดไบนารีของไลบรารี {fmt}
-
แนะนำไลบรารี {fmt}
- {fmt} เป็นไลบรารีสำหรับการจัดรูปแบบที่ขึ้นชื่อเรื่องขนาดไบนารีที่เล็ก
- เมื่อเทียบกับ IOStreams, Boost Format, tinyformat และอื่น ๆ แล้ว ขนาดโค้ดต่อการเรียกใช้ฟังก์ชันเล็กกว่ามาก
- ลดภาระจากเทมเพลตให้เหลือน้อยที่สุดผ่าน type erasure
-
การจัดรูปแบบผ่าน type erasure
- ฟังก์ชัน
formatมอบหมายงานให้ฟังก์ชันvformat - output iterator และ output type อื่น ๆ ก็ถูกทำเป็น type erasure ผ่าน buffer API ที่ออกแบบมาโดยเฉพาะ
- ลดการใช้เทมเพลตให้ต่ำที่สุดเพื่อลดขนาดไบนารีและเวลาในการบิลด์
- ฟังก์ชัน
-
โค้ดตัวอย่าง
#include <fmt/base.h> int main() { fmt::print("The answer is {}.", 42); }- โค้ดข้างต้นคอมไพล์ออกมาได้ขนาดเล็กกว่าโค้ด IOStreams มาก
- แม้เทียบกับ
printfก็มีขนาดใกล้เคียงกัน พร้อมให้ความปลอดภัยของชนิดข้อมูลขณะรันไทม์
-
การปรับขนาดไบนารีให้เหมาะสม
- ในปี 2020 มีการลดขนาดของไลบรารีให้ต่ำกว่า 100kB
- ขนาดไบนารีของเวอร์ชันล่าสุด (11.0.2) อยู่ที่ 75kB
- หากปิดการรองรับ locale จะลดขนาดลงเหลือ 71kB ได้
-
การวิเคราะห์ด้วยเครื่องมือ Bloaty
- การจัดรูปแบบตัวเลข โดยเฉพาะตัวเลขทศนิยมแบบ floating-point กินพื้นที่ส่วนใหญ่
- หากไม่จำเป็นต้องรองรับ floating-point ก็สามารถปิดส่วนนี้ได้
-
การเพิ่มประสิทธิภาพการจัดรูปแบบตามชนิดข้อมูล
- ตั้งค่าแมโคร
FMT_BUILTIN_TYPESเป็น 0 เพื่อให้จัดการเฉพาะชนิด int แบบพิเศษ และให้ชนิดอื่นจัดการผ่าน extended API - วิธีนี้ช่วยลดขนาดไบนารีลงเหลือ 31kB
- ตั้งค่าแมโคร
-
การลบอาร์ติแฟกต์จาก locale
- ใช้แมโคร
FMT_USE_LOCALEเพื่อลบอาร์ติแฟกต์จาก locale จะลดขนาดลงเหลือ 27kB
- ใช้แมโคร
-
จุดแลกเปลี่ยนระหว่างความเร็วกับขนาด
- หากใช้แมโคร
FMT_OPTIMIZE_SIZEเพื่อเน้นการลดขนาด จะลดขนาดไบนารีลงเหลือ 23kB
- หากใช้แมโคร
-
การตัดการพึ่งพา C++ standard library
- ปิด exception และใช้ตัวเลือก
-nodefaultlibsเพื่อตัดการพึ่งพา C++ runtime - นำ custom allocator ที่ใช้
mallocและfreeมาใช้เพื่อลดขนาดไบนารีลงเหลือ 14kB
- ปิด exception และใช้ตัวเลือก
-
การตรวจสอบผลลัพธ์
- ใช้คำสั่ง
lddเพื่อตรวจสอบว่าได้ตัดการพึ่งพา C++ runtime ออกแล้ว
- ใช้คำสั่ง
สรุปโดย GN⁺
- ไลบรารี {fmt} เป็นไลบรารีจัดรูปแบบที่ให้ทั้งขนาดไบนารีเล็กและความปลอดภัยของชนิดข้อมูลขณะรันไทม์
- สามารถลดขนาดไบนารีได้อย่างมากผ่าน type erasure และการตั้งค่าแมโคร
- เมื่อตัดการพึ่งพา C++ standard library ออก ก็สามารถใช้งานได้อย่างมีประสิทธิภาพในระบบฝังตัวด้วย
- ไลบรารีที่มีความสามารถคล้ายกัน ได้แก่ IOStreams, Boost Format และ tinyformat
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
printf(Hello, World!\n")สร้างไฟล์ executable ขนาด 1008 ไบต์ได้