परिचय: C# प्रदर्शन क्यों मायने रखता है
C# और .NET प्लेटफ़ॉर्म उच्च-लोड वेब सेवाओं, डेस्कटॉप अनुप्रयोगों और Unity पर गेम बनाने के लिए शक्तिशाली उपकरण हैं। हालाँकि, सबसे सुंदर कोड भी धीमा चल सकता है यदि CLR (कॉमन लैंग्वेज रनटाइम), कचरा संग्रहण (GC) और JIT-संकलन तंत्र की विशेषताओं पर ध्यान न दिया जाए।
इस लेख में, हम C# अनुप्रयोगों के प्रदर्शन अनुकूलन की प्रमुख विधियों पर चर्चा करेंगे जो आपको प्रतिक्रिया समय कम करने, मेमोरी खपत घटाने और सिस्टम थ्रूपुट बढ़ाने में मदद करेंगी। सभी सुझाव व्यावहारिक कोड उदाहरणों के साथ दिए गए हैं।
1. मेमोरी प्रबंधन और कचरा संग्रहण (GC)
.NET की मुख्य विशेषताओं में से एक स्वचालित मेमोरी प्रबंधन है। लेकिन ऑब्जेक्ट्स का गलत उपयोग बार-बार कचरा संग्रहण का कारण बनता है, जिससे एप्लिकेशन में "रुकावट" (pause) आती है।
1.1. हॉट पथों में आवंटन से बचें
लूप या बार-बार कॉल किए जाने वाले मेथड के अंदर नए ऑब्जेक्ट बनाने से बचने का प्रयास करें। इसके बजाय, ऑब्जेक्ट पूल का उपयोग करें या इंस्टेंस का पुन: उपयोग करें।
// बुरा: प्रत्येक पुनरावृत्ति पर नया StringBuilder बनता हैfor (int i = 0; i < 1000; i++){ var sb = new StringBuilder(); sb.Append(i);}
// अच्छा: पूल का उपयोग करें या पुन: उपयोग करेंvar sbPool = new StringBuilder();for (int i = 0; i < 1000; i++){ sbPool.Clear(); sbPool.Append(i);}1.2. छोटे डेटा के लिए क्लास के बजाय स्ट्रक्चर का उपयोग करें
स्ट्रक्चर (struct) स्टैक पर संग्रहीत होते हैं और GC पर भार नहीं डालते। लेकिन सावधान रहें: बड़े स्ट्रक्चर (16 बाइट्स से अधिक) धीमी गति से कॉपी हो सकते हैं।
public struct Point{ public int X; public int Y;}
// अब मेथड कॉल हीप में ऑब्जेक्ट नहीं बनाताvoid ProcessPoint(Point p) { /* ... */ }1.3. सर्वर अनुप्रयोगों के लिए Server GC मोड चालू करें
डिफ़ॉल्ट रूप से, कंसोल अनुप्रयोगों में Workstation GC का उपयोग होता है। वेब सेवाओं (ASP.NET Core) के लिए, csproj फ़ाइल में Server GC पर स्विच करें:
<PropertyGroup> <ServerGarbageCollection>true</ServerGarbageCollection></PropertyGroup>2. LINQ और कलेक्शन के साथ कार्य का अनुकूलन
LINQ एक सुविधाजनक लेकिन संभावित रूप से धीमा उपकरण है, यदि इसकी "कमियों" को न जाना जाए।
2.1. एकाधिक गणनाओं से बचें
प्रत्येक .Count(), .ToList() या .Any() कॉल क्वेरी को फिर से निष्पादित कर सकता है। परिणाम को एक वेरिएबल में सहेजें।
// बुरा: कलेक्शन पर दो बार लूपif (items.Where(x => x.IsActive).Count() > 0) { /* ... */ }var activeList = items.Where(x => x.IsActive).ToList();
// अच्छा: एक बार लूपvar activeItems = items.Where(x => x.IsActive).ToList();if (activeItems.Count > 0) { /* ... */ }2.2. विशिष्ट कलेक्शन का उपयोग करें
कुंजी द्वारा बार-बार खोज के लिए List<T> के बजाय Dictionary<TKey, TValue> का उपयोग करें। "पहले आओ-पहले पाओ" संचालन के लिए Queue<T> का उपयोग करें।
// तेज़ खोज: O(1) बनाम O(n)var dict = new Dictionary<int, string>();dict.Add(1, "one");if (dict.ContainsKey(1)) { /* ... */ }2.3. महत्वपूर्ण अनुभागों में LINQ को लूप से बदलें
सरल संचालन (योग, फ़िल्टरिंग) के लिए, for या foreach लूप LINQ से 2-3 गुना तेज़ हो सकता है।
// LINQ (धीमा)int sum = numbers.Sum();
// लूप (तेज़)int sum = 0;for (int i = 0; i < numbers.Length; i++){ sum += numbers[i];}3. अतुल्यकालिक प्रोग्रामिंग और ब्लॉकिंग में कमी
async/await का सही उपयोग थ्रेड्स को ब्लॉक नहीं करने देता, जो स्केलेबिलिटी के लिए महत्वपूर्ण है।