परिचय: प्रोफाइलिंग प्रत्येक डेवलपर के लिए क्यों आवश्यक है
\nक्या आपने कभी ऐसा कोड लिखा है जो ठीक काम करता है, लेकिन प्रोडक्शन में 'धीमा' होने लगता है? या हो सकता है, आपने Node.js सर्वर चलाया हो, और कुछ ही मिनटों में वह सारी मेमोरी 'खा' जाता है? अक्सर समस्या भाषा में नहीं, बल्कि बाधाओं में होती है - कोड के वे हिस्से जो अनुकूलतम रूप से निष्पादित नहीं होते।
\nप्रोफाइलिंग (profiling) प्रोग्राम के काम करने के बारे में मेट्रिक्स एकत्र करने की प्रक्रिया है: फ़ंक्शन के निष्पादन समय, मेमोरी खपत, कॉल की आवृत्ति। इसके बिना, कोई भी ऑप्टिमाइज़ेशन अंधेरे में तीर चलाने जैसा है। इस लेख में, हम समझेंगे कि Node.js वातावरण में जावास्क्रिप्ट कोड को कैसे प्रोफाइल करें, 'बाधाओं' का पता लगाएं और उन्हें दूर करें।
\nआप V8 के अंतर्निहित उपकरणों, Chrome DevTools और व्यावहारिक तकनीकों के बारे में जानेंगे जो आपके कोड को तेज़ बनाने में मदद करेंगे।
\n\n1. Node.js में अंतर्निहित प्रोफाइलिंग: --prof फ़्लैग
\nप्रोफाइलिंग शुरू करने का सबसे आसान तरीका Node.js एप्लिकेशन चलाते समय --prof फ़्लैग का उपयोग करना है। यह V8 सांख्यिकी संग्रह को सक्षम करता है, जिसे बाद में एक पठनीय रिपोर्ट में बदल दिया जाता है।
यह कैसे काम करता है
\nअपने एप्लिकेशन को फ़्लैग के साथ चलाएं:
\nnode --prof app.js\nएप्लिकेशन के समाप्त होने के बाद, फ़ोल्डर में isolate-0x...-v8.log नामक एक फ़ाइल दिखाई देगी। यह कच्चा डेटा है। रिपोर्ट प्राप्त करने के लिए, node --prof-process उपयोगिता का उपयोग करें:
node --prof-process isolate-0x...-v8.log > profile.txt\n\nउदाहरण: धीमे फ़ंक्शन का पता लगाना
\nमान लीजिए हमारे पास यह कोड है:
\nfunction slowSort(arr) {\n return arr.sort((a, b) => a - b);\n}\n\nfunction heavyComputation() {\n let sum = 0;\n for (let i = 0; i < 1e7; i++) {\n sum += Math.sqrt(i);\n }\n return sum;\n}\n\n// चलाना\nconst data = Array.from({ length: 10000 }, () => Math.random());\nslowSort(data);\nheavyComputation();\nप्रोफाइलिंग के बाद, रिपोर्ट में आपको कुछ इस तरह दिखाई देगा:
\n[JavaScript]:\n ticks total nonlib name\n 120 60.0% 70.0% LazyCompile: *heavyComputation app.js:5\n 40 20.0% 25.0% LazyCompile: *slowSort app.js:1\nticks संख्या प्रत्येक फ़ंक्शन पर आने वाले 'टिक्स' (सैंपल) की संख्या दर्शाती है। जितने अधिक टिक्स, फ़ंक्शन उतना ही अधिक समय तक निष्पादित हुआ। हमारे मामले में, heavyComputation ऑप्टिमाइज़ेशन के लिए मुख्य उम्मीदवार है।
2. Chrome DevTools: Node.js के लिए विज़ुअल प्रोफाइलर
\nयदि टेक्स्ट रिपोर्ट असुविधाजनक लगती है, तो Chrome DevTools का उपयोग करें। यह एक ग्राफिकल इंटरफ़ेस है जो flamegraph (ज्वाला ग्राफ) दिखाता है - समय के साथ कॉल स्टैक का विज़ुअलाइज़ेशन।
\n\nNode.js प्रक्रिया से कनेक्ट करना
\nएप्लिकेशन को --inspect फ़्लैग के साथ चलाएं:
node --inspect app.js\nChrome खोलें, एड्रेस बार में chrome://inspect टाइप करें। 'Open dedicated DevTools for Node' पर क्लिक करें। आप एक इंटरफ़ेस पर पहुंच जाएंगे जहां आप प्रोफाइल ले सकते हैं।
व्यावहारिक विश्लेषण
\nमेमोरी लीक वाले उदाहरण पर विचार करें:
\nconst cache = [];\n\nfunction addToCache(item) {\n cache.push(item);\n}\n\nfunction processData() {\n for (let i = 0; i < 100000; i++) {\n addToCache({ id: i, data: new Array(1000).fill('x') });\n }\n}\n\nprocessData();\n'Memory' टैब के माध्यम से एक प्रोफाइल रिकॉर्ड करें (हीप का स्नैपशॉट लें)। आप देखेंगे कि cache ऐरे सैकड़ों मेगाबाइट जगह ले रहा है। 'Performance' टैब में flamegraph दिखाएगा कि addToCache फ़ंक्शन को 100,000 बार कॉल किया गया है - यही बाधा है।
समाधान: या तो कैश का आकार सीमित करें, या पुराने तत्वों को स्वचालित रूप से हटाने वाली संरचना का उपयोग करें (उदाहरण के लिए, सीमा के साथ Map)।
3. perf_hooks मॉड्यूल के साथ प्रोफाइलिंग
\nकोड के विशिष्ट भागों के निष्पादन समय को सटीक रूप से मापने के लिए, अंतर्निहित perf_hooks मॉड्यूल का उपयोग करें। यह
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें