TypeScript कोड प्रोफाइलिंग: व्यवहार में कमजोर बिंदु खोजें

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

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

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

TypeScript कोड प्रोफाइलिंग: व्यवहार में कमजोर बिंदु खोजें

\n

हर डेवलपर ने कभी न कभी वह स्थिति देखी है जब एप्लिकेशन धीमा हो जाता है, लेकिन कारण स्पष्ट नहीं होता। TypeScript की दुनिया में, जहां कोड JavaScript में ट्रांसपाइल होता है, कमजोर बिंदु रनटाइम के दौरान या ट्रांसपाइलेशन की विशेषताओं के कारण उत्पन्न हो सकते हैं। इस लेख में हम TypeScript कोड प्रोफाइलिंग के व्यावहारिक तरीकों पर चर्चा करेंगे जो समस्या वाले हिस्सों को पहचानने और आपके एप्लिकेशन की परफॉरमेंस बढ़ाने में मदद करेंगे।

\n\n

TypeScript प्रोफाइलिंग क्यों महत्वपूर्ण है?

\n

TypeScript स्टैटिक टाइपिंग जोड़ता है, लेकिन रनटाइम में सामान्य JavaScript ही चलता है। इसका मतलब है कि कमजोर बिंदु सिर्फ एल्गोरिदम से नहीं, बल्कि TypeScript के कंपाइल होने के तरीके से भी जुड़े हो सकते हैं। उदाहरण के लिए, डेकोरेटर या जटिल जेनेरिक्स का अत्यधिक उपयोग गैर-ऑप्टिमल कोड उत्पन्न कर सकता है। प्रोफाइलिंग इन सवालों के जवाब देने में मदद करती है:

\n
    \n
  • कौन से फंक्शन सबसे ज्यादा समय ले रहे हैं?
  • \n
  • एप्लिकेशन कितनी मेमोरी का उपयोग कर रहा है?
  • \n
  • बार-बार गार्बेज कलेक्शन कहाँ हो रहा है?
  • \n
  • कोड के कौन से हिस्से मेन थ्रेड को ब्लॉक कर रहे हैं?
  • \n
\n

प्रोफाइलिंग के बिना, आप गलत हिस्सों को ऑप्टिमाइज़ करने का जोखिम उठाते हैं, जिससे समय बर्बाद होता है और कोई ठोस सुधार नहीं मिलता।

\n\n

TypeScript प्रोफाइलिंग के लिए उपकरण

\n

TypeScript कोड प्रोफाइलिंग के लिए हम तीन मुख्य उपकरणों का उपयोग करेंगे जो अधिकांश परिदृश्यों को कवर करते हैं: ब्राउज़र एप्लिकेशन से लेकर Node.js पर सर्वर समाधान तक।

\n\n

1. ब्राउज़र एप्लिकेशन के लिए Chrome DevTools

\n

सबसे सुलभ और शक्तिशाली उपकरण। Chrome DevTools में Performance टैब खोलें, रिकॉर्डिंग शुरू करें और एप्लिकेशन में आवश्यक कार्रवाई करें। रुकने के बाद आपको एक flame chart मिलेगा - फंक्शन कॉल का दृश्य प्रतिनिधित्व। व्यवहार में यह इस तरह दिखता है:

\n
// धीमे TypeScript कोड का उदाहरण\nfunction processData(data: number[]): number[] {\n    const result: number[] = [];\n    for (let i = 0; i < data.length; i++) {\n        // संभावित कमजोर बिंदु: बार-बार कॉल\n        result.push(data[i] * Math.sqrt(data[i]));\n    }\n    return result;\n}\n\n// उपयोग\nconst largeArray = Array.from({ length: 100000 }, (_, i) => i);\nconsole.time('processData');\nprocessData(largeArray);\nconsole.timeEnd('processData'); // ~15ms\n
\n

Chrome DevTools में आप देखेंगे कि processData फंक्शन काफी समय ले रहा है, और इसके अंदर Math.sqrt के कई कॉल हैं। यह संकेत है कि आप इटरेशन को map से बदल सकते हैं या गणनाओं को वेक्टराइज़ कर सकते हैं।

\n\n

2. सर्वर एप्लिकेशन के लिए Node.js profiler

\n

Node.js में एक बिल्ट-इन प्रोफाइलर है। एप्लिकेशन को --prof फ्लैग के साथ चलाएं:

\n
node --prof dist/app.js\n
\n

काम पूरा होने पर isolate-*.log फ़ाइल जनरेट होगी। इसे पढ़ने योग्य फॉर्मेट में बदलें:

\n
node --prof-process isolate-*.log > processed.txt\n
\n

एक सामान्य समस्या का उदाहरण - लूप में बार-बार मेमोरी आवंटन:

\n
// खराब उदाहरण: लूप में ऑब्जेक्ट बनाना\ninterface User {\n    id: number;\n    name: string;\n}\n\nfunction createUsers(ids: number[]): User[] {\n    const users: User[] = [];\n    for (const id of ids) {\n        users.push({ id, name: `User_${id}` }); // नया आवंटन\n    }\n    return users;\n}\n
\n

प्रोफाइलर दिखाएगा कि createUsers फंक्शन कई अस्थायी ऑब्जेक्ट बना रहा है, जिससे गार्बेज कलेक्टर पर लोड बढ़ता है। ऑप्टिमाइज़ेशन: पहले से मेमोरी आवंटित करें या ऑब्जेक्ट पूल का उपयोग करें।

\n\n

3. माइक्रोबेंचमार्क के लिए Benchmark.js

\n

जब दो इम्प्लीमेंटेशन की परफॉरमेंस तुलना करनी हो, तो benchmark.js लाइब्रेरी का उपयोग करें। इसे npm के माध्यम से इंस्टॉल करें:

\n
npm install benchmark @types/benchmark\n
\n

एरे फ़िल्टर करने के दो तरीकों की तुलना का उदाहरण:

\n
import Benc                

ब्लॉग

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