परिचय: Rust पहले से ही तेज़ क्यों है, लेकिन यह सीमा नहीं है
\n\nRust को उचित रूप से सबसे अधिक प्रदर्शन करने वाली सिस्टम प्रोग्रामिंग भाषाओं में से एक माना जाता है। zero-cost abstractions और सख्त स्वामित्व प्रणाली के कारण, Rust में कोड अक्सर C या C++ में समतुल्य कोड जितनी ही तेज़ी से चलता है। हालाँकि, Rust में भी कुछ "छिपी हुई समस्याएँ" हैं जो एप्लिकेशन को धीमा कर सकती हैं, विशेष रूप से शुरुआती डेवलपर्स के लिए।
\n\nइस लेख में, हम Rust अनुप्रयोगों के अनुकूलन के प्रमुख सिद्धांतों और व्यावहारिक तकनीकों पर चर्चा करेंगे। आप सीखेंगे कि कोड को कैसे प्रोफाइल करें, अनावश्यक आवंटन से कैसे बचें, संग्रह के साथ कुशलतापूर्वक कैसे काम करें और कंपाइलर की शक्ति का उपयोग कैसे करें। सामग्री शुरुआती लोगों के लिए तैयार की गई है, इसलिए सभी उदाहरण यथासंभव सरल और समझने योग्य होंगे।
\n\nअपने Rust कोड को और भी तेज़ बनाने के लिए तैयार हैं? चलिए शुरू करते हैं!
\n\n1. प्रोफाइलिंग: पहले मापें, फिर अनुकूलित करें
\n\nकुछ भी अनुकूलित करने से पहले, यह समझना आवश्यक है कि वास्तव में क्या धीमा कर रहा है। Rust में इसके लिए उत्कृष्ट उपकरण हैं।
\n\n1.1. cargo bench के साथ बेंचमार्क
\n\nमानक तरीका बेंचमार्क का उपयोग करना है। वे विशिष्ट फ़ंक्शन के निष्पादन समय को मापने की अनुमति देते हैं।
\n\n// फ़ाइल benches/my_bench.rs में\nuse criterion::{criterion_group, criterion_main, Criterion};\n\nfn fibonacci(n: u64) -> u64 {\n match n {\n 0 => 1,\n 1 => 1,\n n => fibonacci(n-1) + fibonacci(n-2),\n }\n}\n\nfn bench_fib(c: &mut Criterion) {\n c.bench_function("fib 20", |b| b.iter(|| fibonacci(20)));\n}\n\ncriterion_group!(benches, bench_fib);\ncriterion_main!(benches);\n\n\nचलाने के लिए Cargo.toml में जोड़ें:
[dev-dependencies]\ncriterion = "0.5"\n\n[[bench]]\nname = "my_bench"\nharness = false\n\nफिर cargo bench निष्पादित करें। आपको सटीक आंकड़े मिलेंगे: निष्पादन समय, मानक विचलन और पिछले रनों से तुलना।
1.2. CPU और मेमोरी प्रोफाइलिंग
\n\nगहन विश्लेषण के लिए उपयोग करें:
\n- \n
- perf (Linux) — कर्नेल-स्तरीय प्रोफाइलर। \n
- Valgrind — मेमोरी लीक और कैश विश्लेषण खोजने के लिए। \n
- flamegraph — कोड के "हॉट स्पॉट" का विज़ुअलाइज़ेशन। \n
flamegraph जनरेट करने का उदाहरण:
\ncargo install flamegraph\ncargo flamegraph --bin my_app\n# ब्राउज़र में flamegraph.svg खोलें\n\n\nFlamegraph दिखाएगा कि कौन से फ़ंक्शन सबसे अधिक समय ले रहे हैं। इससे मुख्य चीज़ों पर ध्यान केंद्रित करने में मदद मिलेगी।
\n\n2. मेमोरी के साथ काम करना: अनावश्यक आवंटन से बचना
\n\nहीप में आवंटन धीमे कोड के सबसे सामान्य कारणों में से एक है। Rust मेमोरी पर पूर्ण नियंत्रण देता है, लेकिन शुरुआती अक्सर Box, Vec और String का दुरुपयोग करते हैं।
2.1. हीप के बजाय स्टैक का उपयोग करें
\n\nजब भी संभव हो, डेटा को स्टैक पर स्टोर करें। उदाहरण के लिए, छोटे फिक्स्ड सेट के लिए Vec के बजाय ऐरे का उपयोग करें:
// धीमा: हीप में आवंटन\nlet data: Vec<i32> = vec![1, 2, 3, 4, 5];\n\n// तेज़: स्टैक\nlet data: [i32; 5] = [1, 2, 3, 4, 5];\n\n\n2.2. पूर्व-आवंटन मेमोरी
\n\nयदि संग्रह का आकार पहले से ज्ञात है, तो with_capacity का उपयोग करें:
// खराब: कई पुनः आवंटन\nlet mut v = Vec::new();\nfor i in 0..1000 {\n v.push(i);\n}\n\n// अच्छा: एक आवंटन\nlet mut v = Vec::with_capacity(1000);\nfor i in 0..1000 {\n v.push(i);\n}\n\n\n2.3. क्लोनिंग से बचें
\n\nस्ट्रिंग और बड़ी संरचनाओं को क्लोन करना एक महंगा ऑपरेशन है। उधार लेने का उपयोग करें (String के बजाय &str):
fn process(s: &str) { /* ... */ }\n\n// खराब: क्लोनिंग\nlet s = String::from("hello");\nprocess(&s.clone());\n\n// अच्छा: उधार लेना\nprocess(&s);\n\n\n