{fmt} लाइब्रेरी का binary size optimization
-
{fmt} लाइब्रेरी का परिचय
- {fmt} एक formatting लाइब्रेरी है जो छोटे binary size के लिए जानी जाती है
- IOStreams, Boost Format, tinyformat आदि की तुलना में प्रति function call code size काफी छोटा है
- type erasure के माध्यम से template overhead को न्यूनतम किया जाता है
-
type erasure के जरिए formatting
formatfunction अपना कामvformatfunction को सौंपता है- output iterator और अन्य output type भी खास तौर पर डिज़ाइन किए गए buffer API के जरिए type erasure किए जाते हैं
- template के उपयोग को न्यूनतम रखकर binary size और build time कम किया जाता है
-
उदाहरण कोड
#include <fmt/base.h> int main() { fmt::print("The answer is {}.", 42); }- ऊपर दिया गया code IOStreams code की तुलना में कहीं छोटे आकार में compile होता है
printfकी तुलना में भी इसका आकार लगभग समान है, और यह runtime type safety देता है
-
binary size optimization
- 2020 में लाइब्रेरी का आकार 100kB से नीचे लाने का काम किया गया
- नवीनतम version (11.0.2) का binary size 75kB है
- locale support को disable करने पर आकार 71kB तक घटाया जा सकता है
-
Bloaty tool से विश्लेषण
- number formatting, खासकर floating-point number formatting, बड़े हिस्से पर कब्ज़ा करती है
- अगर floating-point support की ज़रूरत नहीं है तो इसे disable किया जा सकता है
-
type-विशिष्ट formatting optimization
FMT_BUILTIN_TYPESmacro को 0 पर सेट करके केवल int type को विशेष रूप से handle किया जाता है और बाकी type को extension API के जरिए handle किया जाता है- इस तरीके से binary size को 31kB तक घटाया जा सकता है
-
locale artifacts हटाना
FMT_USE_LOCALEmacro का उपयोग करके locale artifacts हटाने पर आकार 27kB तक घटाया जा सकता है
-
speed और size के बीच trade-off
FMT_OPTIMIZE_SIZEmacro का उपयोग करके size optimize करने पर binary size 23kB तक घट जाता है
-
C++ standard library dependency हटाना
- exceptions को disable करके और
-nodefaultlibsoption का उपयोग करके C++ runtime dependency हटाई जाती है mallocऔरfreeका उपयोग करने वाला custom allocator जोड़कर binary size को 14kB तक घटाया जा सकता है
- exceptions को disable करके और
-
नतीजे की पुष्टि
lddcommand का उपयोग करके यह पुष्टि की गई कि C++ runtime dependency हट चुकी है
GN⁺ का सार
- {fmt} लाइब्रेरी एक formatting लाइब्रेरी है जो छोटा binary size और runtime type safety प्रदान करती है
- type erasure और macro settings के जरिए binary size को काफी कम किया जा सकता है
- C++ standard library dependency हटाकर इसे embedded systems में भी प्रभावी ढंग से इस्तेमाल किया जा सकता है
- समान क्षमता देने वाली लाइब्रेरी में IOStreams, Boost Format, tinyformat आदि शामिल हैं
1 टिप्पणियां
Hacker News राय
mallocऔरfreeका उपयोग नहीं करताmallocऔरfreeको क्यों नहीं कॉल करताprintf("Hello, World!\n")को 1008 bytes के executable size में संभव बनाने वाला एक प्रोजेक्ट हैmainfunction वाला C प्रोग्राम 6kB है, वहाँ {fmt} binary में 10kB से कम जोड़ता है