1 पॉइंट द्वारा GN⁺ 2024-09-02 | 1 टिप्पणियां | WhatsApp पर शेयर करें

{fmt} लाइब्रेरी का binary size optimization

  • {fmt} लाइब्रेरी का परिचय

    • {fmt} एक formatting लाइब्रेरी है जो छोटे binary size के लिए जानी जाती है
    • IOStreams, Boost Format, tinyformat आदि की तुलना में प्रति function call code size काफी छोटा है
    • type erasure के माध्यम से template overhead को न्यूनतम किया जाता है
  • type erasure के जरिए formatting

    • format function अपना काम vformat function को सौंपता है
    • 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_TYPES macro को 0 पर सेट करके केवल int type को विशेष रूप से handle किया जाता है और बाकी type को extension API के जरिए handle किया जाता है
    • इस तरीके से binary size को 31kB तक घटाया जा सकता है
  • locale artifacts हटाना

    • FMT_USE_LOCALE macro का उपयोग करके locale artifacts हटाने पर आकार 27kB तक घटाया जा सकता है
  • speed और size के बीच trade-off

    • FMT_OPTIMIZE_SIZE macro का उपयोग करके size optimize करने पर binary size 23kB तक घट जाता है
  • C++ standard library dependency हटाना

    • exceptions को disable करके और -nodefaultlibs option का उपयोग करके C++ runtime dependency हटाई जाती है
    • malloc और free का उपयोग करने वाला custom allocator जोड़कर binary size को 14kB तक घटाया जा सकता है
  • नतीजे की पुष्टि

    • ldd command का उपयोग करके यह पुष्टि की गई कि 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 टिप्पणियां

 
GN⁺ 2024-09-02
Hacker News राय
  • {fmt} डिफ़ॉल्ट रूप से locale-independent है
  • floating-point formatting के लिए बहुत सारा कोड चाहिए
    • Dragonbox प्रोजेक्ट optimized code के साथ देखने लायक है
  • C++ का default allocator malloc और free का उपयोग नहीं करता
    • यह जानने की जिज्ञासा है कि libc++ का default allocator libc के malloc और free को क्यों नहीं कॉल करता
  • printf("Hello, World!\n") को 1008 bytes के executable size में संभव बनाने वाला एक प्रोजेक्ट है
    • सीधे तुलना करना मुश्किल है, लेकिन संदर्भ के लिए उपयोगी है
  • जिस सिस्टम में empty main function वाला C प्रोग्राम 6kB है, वहाँ {fmt} binary में 10kB से कम जोड़ता है
    • यह एक दिलचस्प test है
  • उम्मीद थी कि एक छोटी formatting library को strings और integers output करने के लिए लगभग 50 bytes चाहिए होंगे
    • strings लगभग 4 instructions से बनते हैं
    • integers लगभग 20 instructions से बनते हैं
    • floating point कई प्रोग्रामों में उपयोग नहीं होता, इसलिए इसे केवल ज़रूरत पड़ने पर compile होना चाहिए
    • अगर किसी microcontroller का code space 2 kilobytes है, तो उसमें 14 kilobytes की string formatting library शामिल नहीं की जाएगी
  • इस तरह के out-of-the-box optimization बहुत आनंददायक होते हैं
  • यह समझने में समय लगा कि "14k" का मतलब "14kB" है
  • fmt हमेशा समस्याएँ पैदा करता है
    • .NET में भी यही समस्या होती है
    • अगर number formatting/parsing बहुत ज़्यादा हो, तो linker बहुत सारा floating-point और BigInt से जुड़ा code शामिल कर लेता है, जिससे binary size बढ़ जाता है