जावास्क्रिप्ट कोड प्रोफाइलिंग: शुरुआती लोगों के लिए बाधाएं ढूँढना

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जावास्क्रिप्ट कोड प्रोफाइलिंग: बाधाएं ढूँढना

\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
\n\n

टूल 1: बिल्ट-इन Node.js प्रोफाइलर (--prof)

\n\n

सबसे आसान तरीका है Node.js को --prof फ्लैग के साथ चलाना। यह निष्पादन आँकड़े एकत्र करता है और उन्हें isolate-*.log फ़ाइल में सहेजता है।

\n\n

आइए एक टेस्ट स्क्रिप्ट बनाएं जिसमें एक बाधा हो:

\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

प्रोफाइलिंग चलाएं:

\n
node --prof slow.js
\n\n

निष्पादन के बाद, isolate-0x...-v8.log फ़ाइल दिखाई देगी। इसे पढ़ने के लिए, node --prof-process उपयोगिता का उपयोग करें:

\n
node --prof-process isolate-0x...-v8.log > profile.txt
\n\n

profile.txt खोलें और समय प्रतिशत वाली तालिका देखें:

\n
[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 फंक्शन पर जा रहा है। अब हम जानते हैं कि पहले क्या ऑप्टिमाइज़ करना है।

\n\n

टूल 2: Chrome DevTools (इंस्पेक्टर)

\n\n

अधिक दृश्य विश्लेषण के लिए, Chrome DevTools कनेक्ट करें। Node.js को --inspect फ्लैग के साथ चलाएं:

\n
node --inspect slow.js
\n\n

Chrome खोलें और chrome://inspect पर जाएं। "Open dedicated DevTools for Node" पर क्लिक करें। "Profiler" टैब → "Start" → स्क्रिप्ट चलाएं → "Stop"।

\n\n

आपको एक flamegraph दिखाई देगा - एक ग्राफ जहाँ ब्लॉक की चौड़ाई निष्पादन समय दर्शाती है। ब्लॉक जितना चौड़ा होगा, फंक्शन उतना ही "हॉट" होगा। हमारा heavyComputation एक बड़ा आयत होगा।

\n\n

सुझाव: फंक्शन के आंतरिक कॉल देखने के लिए "Focus selected" फ़िल्टर का उपयोग करें। उदाहरण के लिए, आप देखेंगे कि Math.sqrt को 10 मिलियन बार कॉल किया गया है - हो सकता है कि आप पहले से वर्गमूल की गणना कर लें।

\n\n

टूल 3: perf_hooks - कोड में सटीक माप

\n\n

कभी-कभी बाहरी टूल चलाए बिना कोड के किसी विशिष्ट भाग को मापने की आवश्यकता होती है। इसके लिए बिल्ट-इन perf_hooks मॉड्यूल का उपयोग करें।

\n\n

फंक्शन निष्पादन समय मापने का उदाहरण:

\n\n
const { 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                

ब्लॉग

पुस्तक अनुशंसाएँ