जावास्क्रिप्ट कोड प्रोफाइलिंग: व्यवहार में बाधाओं का पता लगाना

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

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

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

परिचय: प्रोफाइलिंग प्रत्येक डेवलपर के लिए क्यों आवश्यक है

\n

क्या आपने कभी ऐसा कोड लिखा है जो ठीक काम करता है, लेकिन प्रोडक्शन में 'धीमा' होने लगता है? या हो सकता है, आपने Node.js सर्वर चलाया हो, और कुछ ही मिनटों में वह सारी मेमोरी 'खा' जाता है? अक्सर समस्या भाषा में नहीं, बल्कि बाधाओं में होती है - कोड के वे हिस्से जो अनुकूलतम रूप से निष्पादित नहीं होते।

\n

प्रोफाइलिंग (profiling) प्रोग्राम के काम करने के बारे में मेट्रिक्स एकत्र करने की प्रक्रिया है: फ़ंक्शन के निष्पादन समय, मेमोरी खपत, कॉल की आवृत्ति। इसके बिना, कोई भी ऑप्टिमाइज़ेशन अंधेरे में तीर चलाने जैसा है। इस लेख में, हम समझेंगे कि Node.js वातावरण में जावास्क्रिप्ट कोड को कैसे प्रोफाइल करें, 'बाधाओं' का पता लगाएं और उन्हें दूर करें।

\n

आप V8 के अंतर्निहित उपकरणों, Chrome DevTools और व्यावहारिक तकनीकों के बारे में जानेंगे जो आपके कोड को तेज़ बनाने में मदद करेंगे।

\n\n

1. Node.js में अंतर्निहित प्रोफाइलिंग: --prof फ़्लैग

\n

प्रोफाइलिंग शुरू करने का सबसे आसान तरीका Node.js एप्लिकेशन चलाते समय --prof फ़्लैग का उपयोग करना है। यह V8 सांख्यिकी संग्रह को सक्षम करता है, जिसे बाद में एक पठनीय रिपोर्ट में बदल दिया जाता है।

\n\n

यह कैसे काम करता है

\n

अपने एप्लिकेशन को फ़्लैग के साथ चलाएं:

\n
node --prof app.js
\n

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

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

उदाहरण: धीमे फ़ंक्शन का पता लगाना

\n

मान लीजिए हमारे पास यह कोड है:

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

ticks संख्या प्रत्येक फ़ंक्शन पर आने वाले 'टिक्स' (सैंपल) की संख्या दर्शाती है। जितने अधिक टिक्स, फ़ंक्शन उतना ही अधिक समय तक निष्पादित हुआ। हमारे मामले में, heavyComputation ऑप्टिमाइज़ेशन के लिए मुख्य उम्मीदवार है।

\n\n

2. Chrome DevTools: Node.js के लिए विज़ुअल प्रोफाइलर

\n

यदि टेक्स्ट रिपोर्ट असुविधाजनक लगती है, तो Chrome DevTools का उपयोग करें। यह एक ग्राफिकल इंटरफ़ेस है जो flamegraph (ज्वाला ग्राफ) दिखाता है - समय के साथ कॉल स्टैक का विज़ुअलाइज़ेशन।

\n\n

Node.js प्रक्रिया से कनेक्ट करना

\n

एप्लिकेशन को --inspect फ़्लैग के साथ चलाएं:

\n
node --inspect app.js
\n

Chrome खोलें, एड्रेस बार में chrome://inspect टाइप करें। 'Open dedicated DevTools for Node' पर क्लिक करें। आप एक इंटरफ़ेस पर पहुंच जाएंगे जहां आप प्रोफाइल ले सकते हैं।

\n\n

व्यावहारिक विश्लेषण

\n

मेमोरी लीक वाले उदाहरण पर विचार करें:

\n
const 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 बार कॉल किया गया है - यही बाधा है।

\n

समाधान: या तो कैश का आकार सीमित करें, या पुराने तत्वों को स्वचालित रूप से हटाने वाली संरचना का उपयोग करें (उदाहरण के लिए, सीमा के साथ Map)।

\n\n

3. perf_hooks मॉड्यूल के साथ प्रोफाइलिंग

\n

कोड के विशिष्ट भागों के निष्पादन समय को सटीक रूप से मापने के लिए, अंतर्निहित perf_hooks मॉड्यूल का उपयोग करें। यह

ब्लॉग

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