परिचय: Rust कोड को प्रोफाइल क्यों करें?
\n\nRust अपनी गति और सुरक्षा के लिए प्रसिद्ध है, लेकिन सबसे तेज़ कोड भी धीमा चल सकता है यदि उसमें बाधाएं हों। प्रोफाइलिंग प्रोग्राम के प्रदर्शन को मापने की प्रक्रिया है: निष्पादन समय, CPU लोड, मेमोरी और अन्य मीट्रिक। Rust पर शुरुआती डेवलपर्स के लिए यह एक अपरिहार्य कौशल है, जो 'बस काम करने वाले' कोड को कुशल और तेज़ में बदलने में सक्षम बनाता है।
\n\nकल्पना करें कि आपने Rust में एक लॉग पार्सर या गेम लिखा है। सब कुछ कंपाइल होता है, लेकिन प्रोग्राम अपेक्षा से अधिक समय तक चलता है। यह अनुमान लगाने के बजाय कि कोड का कौन सा भाग धीमा है, आप प्रोफाइलर का उपयोग कर सकते हैं जो सटीक 'हॉटस्पॉट' दिखाएंगे। इस लेख में, हम शुरुआती लोगों के लिए Rust प्रोफाइलिंग के मुख्य टूल्स पर चर्चा करेंगे: cargo-flamegraph, perf और std::time::Instant के साथ सरल माप।
1. सबसे सरल तरीका: std::time::Instant के साथ समय माप
\n\nजटिल टूल्स पर जाने से पहले, कोड के अलग-अलग हिस्सों के निष्पादन समय को मापना सीखें। यह शुरुआती लोगों के लिए एक बुनियादी लेकिन प्रभावी तरीका है।
\n\nउदाहरण: फ़ंक्शन के निष्पादन समय का माप
\n\nuse std::time::Instant;\n\nfn slow_function() {\n let mut sum = 0u64;\n for i in 0..1_000_000 {\n sum += i;\n }\n println!("योग: {}", sum);\n}\n\nfn main() {\n let start = Instant::now();\n slow_function();\n let duration = start.elapsed();\n println!("निष्पादन समय: {:?}", duration);\n}\n\n\nयह कोड slow_function का सटीक कार्य समय प्रिंट करेगा। हालांकि, यह दृष्टिकोण बड़ी परियोजनाओं के लिए सुविधाजनक नहीं है: आपको प्रत्येक संदिग्ध स्थान पर मैन्युअल रूप से माप लगाने होंगे।
यह कब उपयोगी है?
\n- \n
- आप किसी धीमे फ़ंक्शन के बारे में अपनी परिकल्पना को जल्दी से जांचना चाहते हैं। \n
- अतिरिक्त टूल्स स्थापित करने की कोई संभावना नहीं है। \n
- आप जटिल तर्क के बिना सिंगल-थ्रेडेड कोड पर काम कर रहे हैं। \n
कमी: मैन्युअल माप यह नहीं दिखाते कि कॉल किए गए फ़ंक्शन (जैसे, मेमोरी आवंटन या सिस्टम कॉल) के अंदर कितना समय खर्च होता है। इसके लिए प्रोफाइलर की आवश्यकता होती है।
\n\n2. perf (Linux) के साथ प्रोफाइलिंग
\n\nउपयोगिता perf Linux के लिए एक शक्तिशाली प्रोफाइलर है जो कर्नेल स्तर पर काम करता है। यह नमूने (samples) एकत्र करता है कि प्रोग्राम अपना समय कहाँ बिताता है। शुरू करने के लिए, सुनिश्चित करें कि perf स्थापित है:
sudo apt install linux-tools-common linux-tools-generic # Ubuntu/Debian\n\n\nचरण 1: डिबग जानकारी के साथ संकलन
\nताकि perf फ़ंक्शन नाम और कोड लाइनें दिखा सके, प्रोजेक्ट को डिबग मोड (या debuginfo फ़्लैग के साथ रिलीज़) में कंपाइल करें:
cargo build\n# या\nRUSTFLAGS="-g" cargo build --release\n\n\nचरण 2: प्रोफाइलिंग चलाना
\nperf record -g ./target/debug/आपका_प्रोग्राम\nperf report\n\n\nफ़्लैग -g कॉल स्टैक (call graph) रिकॉर्डिंग को सक्षम करता है। perf report चलाने के बाद, आप निष्पादन समय के अनुसार क्रमबद्ध फ़ंक्शन की एक इंटरैक्टिव सूची देखेंगे।
व्याख्या का उदाहरण
\nमान लीजिए, आप देखते हैं कि 70% समय फ़ंक्शन Vec::push लेता है। इसका मतलब हो सकता है कि आप बार-बार मेमोरी पुनः आवंटित कर रहे हैं। समाधान: Vec::with_capacity का उपयोग करके पहले से वेक्टर की क्षमता आवंटित करें।
सुझाव: शुरुआती लोगों के लिए, डेटा की अधिकता के कारण perf जटिल लग सकता है। रीयल-टाइम में यह देखने के लिए perf top से शुरुआत करें कि कौन से फ़ंक्शन अभी 'जल रहे' हैं।
3. cargo-flamegraph के साथ विज़ुअलाइज़ेशन
\n\nयदि आपको एक स्पष्ट चित्र चाहिए, तो cargo-flamegraph का उपयोग करें। यह टूल फ्लेमग्राफ़ (flamegraphs) बनाता है - ग्राफ़ जहाँ आयत की चौड़ाई फ़ंक्शन के निष्पादन समय को दर्शाती है, और गहराई कॉल स्टैक में नेस्टिंग को दर्शाती है।