ऐरे पूल

Dec 15 2022
आजकल, हम शायद ही कभी सरणियों का उपयोग करते हैं। ज्यादातर मामलों में, हम सूची <टी> का उपयोग करते हैं, जो अधिक कार्यक्षमता प्रदान करता है और हुड के नीचे एक सरणी पर आधारित होता है।

आजकल, हम शायद ही कभी सरणियों का उपयोग करते हैं। ज्यादातर मामलों में, हम सूची <टी> का उपयोग करते हैं, जो अधिक कार्यक्षमता प्रदान करता है और हुड के नीचे एक सरणी पर आधारित होता है। लेकिन ऐसी परिस्थितियां होती हैं जब कई वस्तुओं से निपटने के दौरान प्रदर्शन महत्वपूर्ण होता है।

मुझे जो आश्चर्य हुआ वह यह है कि एक सादा सरणी एक सूची के रूप में दोगुनी कुशल है, और इसे अभी भी ऐरेपूल के साथ अनुकूलित किया जा सकता है।

इस लेख में, मैं आपको कोड उदाहरण और बेंचमार्किंग प्रदर्शन के साथ ArrayPool का उपयोग करने का तरीका दिखाऊंगा।

कोड रिपोजिटरी

ऐरेपूल क्या है

ArrayPool एक संसाधन पूल है जो सरणी प्रकारों के उदाहरणों का पुन: उपयोग करने की अनुमति देता है। आप इसे किराए पर लेने और बफ़र्स (सरणियाँ) वापस करने के लिए उपयोग कर सकते हैं। जब आप बार-बार ऐरे बनाते और नष्ट करते हैं, जो मेमोरी और गारबेज कलेक्टर पर भारी होते हैं, तो यह प्रदर्शन में सुधार करेगा । यह वर्ग थ्रेड-सुरक्षित है और आप इसे समवर्ती रूप से उपयोग कर सकते हैं। पूल में लौटते समय, आप सामग्री को साफ़ करना या न करना चुन सकते हैं। समाशोधन में अधिक समय लगेगा, लेकिन आपकी स्थिति में हर बार खाली सरणी प्राप्त करने की आवश्यकता हो सकती है।

इसका उपयोग कैसे करना है

पूल मेमोरी से सरणियों तक पहुँचने के दो तरीके हैं।

ArrayPool साझा संपत्ति का उपयोग करना पहला और सरल है।

ऐरेपूल <टी>। साझा किया गया

आपको पूल का डिफ़ॉल्ट इम्प्लीमेंटेशन मिलेगा। इसमें विभिन्न आकारों के सरणियाँ होती हैं। यह आपके द्वारा अनुरोधित की तुलना में एक बड़ा सरणी लौटा सकता है लेकिन निश्चित रूप से छोटा नहीं है। एक साझा पूल सरणी का पुन: उपयोग करने का एक सुविधाजनक तरीका है, लेकिन बेहतर हैं।

बनाने के तरीकों का उपयोग करके अपने पूल को इनिशियलाइज़ करना अधिक कुशल तरीका है।

ऐरेपूल <टी>। क्रिएट ()

ArrayPool<T>.Create(int maxArrayLength, int maxArraysPerBucket)

बनाएँ विधि पूल का एक कस्टम उदाहरण लौटाती है। इसे पुन: उपयोग करने के लिए विभिन्न स्थानों से इसे एक्सेस करने के लिए आपको इसे कैश करना होगा। पैरामीटरयुक्त विधि सर्वश्रेष्ठ प्रदर्शन प्राप्त करने में मदद कर सकती है। यह एक ऐसा उदाहरण बनाएगा जो लंबाई के सरणियों को maxArrayLength से अधिक नहीं आकार के बकेट में maxArraysPerBucket बनाता है।

आवंटन कम करने और अपने अनुप्रयोगों के प्रदर्शन में सुधार करने के लिए सी # में सरणी पूलिंग का लाभ उठाएं।

बेंचमार्क

यह एक सीधी परीक्षा है। हम एक नई सरणी बनाने और इसे पूल से किराए पर लेने के बीच के अंतरों की तुलना करेंगे। प्रत्येक मामले में, हम 1_000_000 तत्वों के संग्रह पर पुनरावृति करेंगे। मैं सरणियों के प्रदर्शन लाभ दिखाने के लिए बेंचमार्क में List<T> भी शामिल करूंगा।

कोड रिपोजिटरी

तल चिह्न

निष्कर्ष

मुझे सबसे ज्यादा आश्चर्य हुआ है कि गति और स्मृति उपयोग के मामले में एक सादा सरणी सूची के रूप में दोगुनी कुशल है। और इसे अभी भी ArrayPool के साथ अनुकूलित किया जा सकता है। पूल का उपयोग करना स्पष्ट रूप से जाने का रास्ता है।

मानक सरणी और पूल से एक का उपयोग करने के बीच ध्यान देने योग्य समय अंतर है। समय का अंतर हर बार एक नई सरणी बनाते समय मेमोरी आवंटित करने के लिए आवश्यक समय होता है। बेशक, मेमोरी आवंटन में भी अंतर है। ArrayPool को नई मेमोरी आवंटित करने की आवश्यकता नहीं है। यह उसी ब्लॉक का पुन: उपयोग करता है।

एक चेतावनी के रूप में, मैंने 'कैशिंग के बिना कस्टम पूल' जोड़ा है ताकि आप देख सकें कि जब आप हर बार एक नया पूल बनाते हैं तो क्या होता है। यह मूल रूप से हर बार एक नई सरणी बनाने जैसा ही है।

इस सरल उदाहरण में, साझा और कस्टम ArrayPool के बीच प्रदर्शन अंतर दिखाना कठिन है। यह ध्यान देने योग्य होगा जब विभिन्न आकारों के कई सरणियों का उपयोग किया जाता है।

ArrayPool का उपयोग करना हमेशा सबसे सुविधाजनक नहीं हो सकता है, लेकिन कभी-कभी आवश्यकता पड़ने पर यह आपको बहुत अधिक कंप्यूटिंग शक्ति बचा सकता है।