इस प्रोजेक्ट के बारे में
यह रिपॉजिटरी Rust बाइनरी का आकार कम करने के लिए एक व्यापक, व्यावहारिक मार्गदर्शिका है। यह स्वीकार करता है कि Rust का डिफ़ॉल्ट ऑप्टिमाइज़ेशन निष्पादन गति और डिबगिंग सुविधा को लक्षित करता है, लेकिन छोटे एक्ज़ीक्यूटेबल की आवश्यकता वाले डेवलपर्स के लिए एक स्पष्ट, चरण-दर-चरण मार्ग प्रदान करता है।
मार्गदर्शिका मूल तकनीकों से शुरू होती है जिनका प्रोग्राम व्यवहार पर कोई प्रभाव नहीं पड़ता:
- रिलीज़ मोड में बिल्ड करना, जो डिबग बिल्ड की तुलना में बाइनरी आकार को 30% या अधिक कम कर सकता है।
- Cargo की `strip = true` सेटिंग (Rust 1.59 से उपलब्ध) का उपयोग करके बाइनरी से प्रतीकों को स्वचालित रूप से हटाना, या पुराने संस्करणों के लिए ELF फ़ाइल पर मैन्युअल रूप से `strip` चलाना।
- `Cargo.toml` में `opt-level = "z"` सेट करना ताकि गति के बजाय आकार के लिए अनुकूलन हो, साथ ही यह नोट किया गया है कि `"s"` कभी-कभी छोटे परिणाम दे सकता है और प्रयोग की सिफारिश की जाती है।
- लिंक टाइम ऑप्टिमाइज़ेशन (LTO) सक्षम करना ताकि लिंकर मृत कोड हटा सके और संकलन इकाइयों में अनुकूलन कर सके।
- `codegen-units` को 1 तक कम करना ताकि संकलन समय की कीमत पर अधिक आक्रामक अनुकूलन सक्षम हो सके।
मार्गदर्शिका फिर अधिक उन्नत तकनीकों की ओर बढ़ती है जो प्रोग्राम व्यवहार को बदल सकती हैं या नाइटली Rust की आवश्यकता हो सकती है:
- अनवाइंडिंग कोड हटाने के लिए `panic = "abort"` का उपयोग करना, और स्थान और फ़ॉर्मेटिंग विवरण हटाने के लिए अस्थिर `-Zlocation-detail=none` और `-Zfmt-debug=none` फ्लैग।
- `build-std` के साथ मानक पुस्तकालय को स्रोत से बनाना, जो `libstd` को आकार के लिए अनुकूलित करने और अनावश्यक भागों को हटाने की अनुमति देता है। इसमें `optimize_for_size` सुविधा और पैनिक स्ट्रिंग्स को खत्म करने के लिए अस्थिर `panic=immediate-abort` विकल्प शामिल है।
- `#![no_std]` और `#![no_main]` के साथ `libstd` को पूरी तरह से हटाना, C एंट्री पॉइंट और मैन्युअल stdio प्रबंधन का उपयोग करना। इसे हैकी और अप्रतिष्ठित बताया गया है, जिसमें निर्भरताओं का सावधानीपूर्वक विश्लेषण आवश्यक है, लेकिन यह C प्रोग्राम जितनी छोटी बाइनरी उत्पन्न कर सकता है।
मार्गदर्शिका इन्हें भी शामिल करती है:
- अंतिम बाइनरी को संपीड़ित करने के लिए UPX का उपयोग, संभावित एंटीवायरस झूठी सकारात्मकता की चेतावनी के साथ।
- बाइनरी आकार का विश्लेषण और कम करने के लिए उपकरण, जैसे `cargo-bloat`, `momo`, और WebAssembly के लिए Twiggy।
- कंटेनर छवि आकार कम करने की तकनीकें, जिनमें `rust:alpine` छवि, छवियों का पता लगाने के लिए `dive`, और न्यूनतम बेस छवियों के लिए `distroless` शामिल हैं।
- बाहरी संसाधनों के लिंक, जिनमें छोटी Rust बाइनरी, WASM आकार कम करने, और Rust बाइनरी आकार कार्य समूह के बारे में ब्लॉग पोस्ट शामिल हैं।
- Rust 1.32 में jemalloc हटाने और पुराने संस्करणों को संभालने के बारे में ऐतिहासिक नोट्स।
उदाहरण प्रोजेक्ट `build_std` और `no_std` फ़ोल्डरों में प्रदान किए गए हैं, और मार्गदर्शिका वास्तविक दुनिया के केस स्टडीज़ जैसे छोटे Rocket वेब सर्वर और GStreamer प्लगइन का संदर्भ देती है। यह जोर देती है कि तकनीकें संचयी हैं, प्रत्येक कदम जटिलता या पोर्टेबिलिटी की कीमत पर अतिरिक्त आकार कटौती प्रदान करता है।
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.