समवर्ती रूप से निष्पादित इकाइयों के साथ उच्चतम प्रदर्शन के लिए, अपना स्वयं का थ्रेड पूल लिखें, जहां थ्रेड ऑब्जेक्ट्स का एक पूल स्टार्ट अप पर बनाया गया है और ब्लॉकिंग (पूर्व में निलंबित) पर जाता है, चलाने के लिए एक संदर्भ पर प्रतीक्षा कर रहा है (एक मानक इंटरफ़ेस के साथ एक ऑब्जेक्ट जिसे लागू किया गया है) तुम्हारा कोड)।
.NET थ्रेडपूल बनाम कार्य बनाम थ्रेड्स के बारे में बहुत सारे लेख वास्तव में आपको वह देने में विफल होते हैं जो आपको प्रदर्शन के लिए निर्णय लेने की आवश्यकता होती है। लेकिन जब आप उनकी तुलना करते हैं, तो थ्रेड्स जीत जाते हैं और विशेष रूप से थ्रेड्स का एक पूल। उन्हें सीपीयू में सर्वश्रेष्ठ वितरित किया जाता है और वे तेजी से शुरू होते हैं।
क्या चर्चा की जानी चाहिए तथ्य यह है कि विंडोज की मुख्य निष्पादन इकाई (विंडोज 10 सहित) एक धागा है, और ओवरहेड पर स्विच करने वाला ओएस संदर्भ आमतौर पर नगण्य है। सीधे शब्दों में कहें, मैं इनमें से कई लेखों के पुख्ता सबूत नहीं खोज पाया हूं, चाहे लेख संदर्भ स्विचिंग या सीपीयू उपयोग द्वारा उच्च प्रदर्शन का दावा करता हो।
अब थोड़ा सा यथार्थवाद के लिए:
हम में से अधिकांश को हमारे आवेदन को नियतात्मक होने की आवश्यकता नहीं होगी, और हम में से अधिकांश के पास थ्रेड्स के साथ एक हार्ड-नॉक पृष्ठभूमि नहीं है, जो उदाहरण के लिए अक्सर एक ऑपरेटिंग सिस्टम विकसित करने के साथ आता है। मैंने जो ऊपर लिखा है वह एक शुरुआत के लिए नहीं है।
इसलिए जो सबसे महत्वपूर्ण हो सकता है, उस पर चर्चा करना आसान है जो कि कार्यक्रम के लिए आसान है।
यदि आप अपना स्वयं का थ्रेड पूल बनाते हैं, तो आपके पास लिखने के लिए थोड़ा सा होगा जैसा कि आपको ट्रैकिंग निष्पादन स्थिति से संबंधित होना चाहिए, सस्पेंड और फिर से शुरू करने के लिए कैसे अनुकरण करना है, और निष्पादन को कैसे रद्द करना है - एक आवेदन-पत्र सहित बंद करना। आपको इस बात से भी चिंतित होना होगा कि क्या आप अपने पूल को गतिशील रूप से विकसित करना चाहते हैं और यह भी कि आपके पूल की क्षमता किस सीमा तक होगी। मैं इस तरह की रूपरेखा एक घंटे में लिख सकता हूं, लेकिन ऐसा इसलिए है क्योंकि मैंने इसे कई बार किया है।
शायद टास्क का उपयोग करने के लिए एक निष्पादन इकाई लिखने का सबसे आसान तरीका है। एक टास्क की खूबी यह है कि आप इसे बना सकते हैं और इसे अपने कोड में इन-लाइन से किक कर सकते हैं (हालांकि सावधानी बरती जा सकती है)। जब आप कार्य को रद्द करना चाहते हैं, तो आप इसे रद्द करने के लिए एक टोकन टोकन पास कर सकते हैं। इसके अलावा, यह चेंजिंग इवेंट्स के लिए वादे के दृष्टिकोण का उपयोग करता है, और आप इसे एक विशिष्ट प्रकार का मान लौटा सकते हैं। इसके अलावा, async और प्रतीक्षा के साथ, अधिक विकल्प मौजूद हैं और आपका कोड अधिक पोर्टेबल होगा।
संक्षेप में, नियम और थ्रेड बनाम थ्रेड बनाम .NET थ्रेडपूल के साथ विपक्ष को समझना महत्वपूर्ण है। यदि मुझे उच्च प्रदर्शन की आवश्यकता है, तो मैं थ्रेड्स का उपयोग करने जा रहा हूं, और मैं अपने स्वयं के पूल का उपयोग करना पसंद करता हूं।
तुलना करने का एक आसान तरीका 512 थ्रेड्स, 512 टास्क और 512 थ्रेडपूल थ्रेड्स है। आपको थ्रेड्स के साथ शुरुआत में देरी होगी (इसलिए, थ्रेड पूल क्यों लिखें), लेकिन सभी 512 थ्रेड्स कुछ सेकंड में चलेंगे जबकि टास्क और .NET थ्रेडपूल थ्रेड्स को शुरू होने में कुछ मिनट लगते हैं।
नीचे ऐसे परीक्षण के परिणाम (i5 क्वाड कोर 16 जीबी रैम के साथ) दिए गए हैं, जो प्रत्येक 30 सेकंड को चलाने के लिए देते हैं। निष्पादित कोड एक एसएसडी ड्राइव पर सरल फ़ाइल I / O निष्पादित करता है।
परीक्षण के परिणाम