जावास्क्रिप्ट कोड प्रोफाइलिंग: बाधाएं ढूँढना
\n\nजब आपका Node.js प्रोजेक्ट धीमा होने लगता है, तो पहला विचार आता है - "सब कुछ Rust में फिर से लिखना होगा"। लेकिन जल्दबाजी न करें! अक्सर समस्या कोड की कुछ पंक्तियों में होती है जो अकुशलता से काम कर रही हैं। इस लेख में, हम सीखेंगे कि सरल प्रोफाइलिंग टूल का उपयोग करके इन "बाधाओं" को कैसे खोजा जाए। आप जानेंगे कि प्रदर्शन को कैसे मापें, flamegraph कैसे बनाएं और समझें कि CPU कहाँ खर्च हो रहा है।
\n\nकोड को प्रोफाइल क्यों करें?
\n\nकल्पना करें कि आपका सर्वर प्रति सेकंड 100 अनुरोधों को संसाधित कर रहा है, और आपको 500 की आवश्यकता है। आप सब कुछ ऑप्टिमाइज़ कर सकते हैं, लेकिन इसमें हफ्ते लग जाएंगे। या आप एक ऐसा फंक्शन ढूंढ सकते हैं जो 80% समय ले रहा है और इसे एक घंटे में ठीक कर सकते हैं। प्रोफाइलिंग वही है जो दिखाता है कि समय कहाँ खर्च हो रहा है।
\n\nआइए उन मुख्य परिदृश्यों पर विचार करें जहाँ प्रोफाइलिंग आवश्यक है:
\n- \n
- API प्रतिक्रियाओं में उच्च विलंबता \n
- मेमोरी लीक (memory leaks) \n
- बिना किसी स्पष्ट कारण के CPU पर उच्च लोड \n
- बड़े डेटा सरणियों का धीमा प्रसंस्करण \n
टूल 1: बिल्ट-इन Node.js प्रोफाइलर (--prof)
\n\nसबसे आसान तरीका है Node.js को --prof फ्लैग के साथ चलाना। यह निष्पादन आँकड़े एकत्र करता है और उन्हें isolate-*.log फ़ाइल में सहेजता है।
आइए एक टेस्ट स्क्रिप्ट बनाएं जिसमें एक बाधा हो:
\n\n// slow.js\nfunction heavyComputation() {\n let sum = 0;\n for (let i = 0; i < 1e7; i++) {\n sum += Math.sqrt(i) * Math.sin(i);\n }\n return sum;\n}\n\nfunction fastFunction() {\n return 42;\n}\n\nconsole.time('total');\nheavyComputation();\nfastFunction();\nconsole.timeEnd('total');\n\n\nप्रोफाइलिंग चलाएं:
\nnode --prof slow.js\n\nनिष्पादन के बाद, isolate-0x...-v8.log फ़ाइल दिखाई देगी। इसे पढ़ने के लिए, node --prof-process उपयोगिता का उपयोग करें:
node --prof-process isolate-0x...-v8.log > profile.txt\n\nprofile.txt खोलें और समय प्रतिशत वाली तालिका देखें:
[Summary]:\n ticks total nonlib name\n 785 78.5% 85.3% JavaScript\n 215 21.5% 14.7% C++\n ...\n[Bottom up (heavy) profile]:\n ticks parent name\n 500 50.0% LazyCompile: *heavyComputation slow.js:2:17\n 100 10.0% Builtin: MathSqrt\n 50 5.0% Builtin: MathSin\n\n\nहम देखते हैं कि 50% समय heavyComputation फंक्शन पर जा रहा है। अब हम जानते हैं कि पहले क्या ऑप्टिमाइज़ करना है।
टूल 2: Chrome DevTools (इंस्पेक्टर)
\n\nअधिक दृश्य विश्लेषण के लिए, Chrome DevTools कनेक्ट करें। Node.js को --inspect फ्लैग के साथ चलाएं:
node --inspect slow.js\n\nChrome खोलें और chrome://inspect पर जाएं। "Open dedicated DevTools for Node" पर क्लिक करें। "Profiler" टैब → "Start" → स्क्रिप्ट चलाएं → "Stop"।
आपको एक flamegraph दिखाई देगा - एक ग्राफ जहाँ ब्लॉक की चौड़ाई निष्पादन समय दर्शाती है। ब्लॉक जितना चौड़ा होगा, फंक्शन उतना ही "हॉट" होगा। हमारा heavyComputation एक बड़ा आयत होगा।
सुझाव: फंक्शन के आंतरिक कॉल देखने के लिए "Focus selected" फ़िल्टर का उपयोग करें। उदाहरण के लिए, आप देखेंगे कि Math.sqrt को 10 मिलियन बार कॉल किया गया है - हो सकता है कि आप पहले से वर्गमूल की गणना कर लें।
टूल 3: perf_hooks - कोड में सटीक माप
\n\nकभी-कभी बाहरी टूल चलाए बिना कोड के किसी विशिष्ट भाग को मापने की आवश्यकता होती है। इसके लिए बिल्ट-इन perf_hooks मॉड्यूल का उपयोग करें।
फंक्शन निष्पादन समय मापने का उदाहरण:
\n\nconst { performance } = require('perf_hooks');\n\nfunction processData(items) {\n let result = [];\n for (let item of items) {\n // जटिल प्रसंस्करण का अनुकरण\n for (let j = 0; j < 1000; j++) {\n result.push(item * j);\n }\n \n