सारांश स्वाभाविक तेजी से होता है: मैं एक साधारण plinq (समांतर Linq) प्रश्न के System.Threading.Tasks.Parallel.ForEach और समवर्ती डेटा संरचना से बदल दिया है। गति अद्भुत थी।PLinq से System.Threading.Tasks.Parallel.ForEach
तो समानांतर से स्वाभाविक रूप से तेज़ है। फॉरएच? या यह कार्य के लिए विशिष्ट है।
// Original Code
// concurrent dictionary to store results
var resultDict = new ConcurrentDictionary<string, MyResultType>();
Parallel.ForEach(items, item =>
{
resultDict.TryAdd(item.Name, PerformWork(source));
});
// new code
var results =
items
.AsParallel()
.Select(item => new { item.Name, queryResult = PerformWork(item) })
.ToDictionary(kv => kv.SourceName, kv => kv.queryResult);
नोट्स: प्रत्येक कार्य (PerformWork) अब 0 और 200 के बीच एमएस चलाता है। इसे अनुकूलित करने से पहले इसे अधिक समय लगता था। यही कारण है कि मैं मुट्ठी जगह में कार्य। समानांतर पुस्तकालय का उपयोग कर रहा था। तो मैं कुल समय 2 सेकंड से 100-200 एमएस तक चला गया, कुल मिलाकर एक ही काम कर रहा था, बस विभिन्न तरीकों से। (वाह LINQ और plinq भयानक कर रहे हैं!)
प्रश्न:
- गति बनाम Parallel.ForEach plinq का उपयोग कर की वजह से है?
- क्या यह इसके बजाय समवर्ती डेटा संरचना (ConcurrentDictionary) को हटाने के बजाय है? (क्योंकि इसे धागे को सिंक्रनाइज़ करने की आवश्यकता नहीं है)।
- इस related question
PLINQ जबकि से जवाब के आधार पर मोटे तौर पर कोई दुष्प्रभाव के साथ प्रोग्रामिंग का एक कार्यात्मक शैली पर आधारित है, दुष्प्रभाव ठीक कर रहे हैं क्या TPL के लिए है। यदि आप समानांतर में चीजों को खोजने/चुनने के विरोध में वास्तव में समानांतर में काम करना चाहते हैं, तो आप टीपीएल का उपयोग करते हैं।
क्या मुझे लगता है कि मेरा पैटर्न मूल रूप से कार्यात्मक है (इनपुट देने से उत्परिवर्तन के बिना नए आउटपुट उत्पन्न होते हैं), कि प्लिनक उपयोग करने के लिए सही तकनीक है?
मैं सत्यापन की तलाश में हूं कि मेरी धारणाएं सही हैं, या एक संकेत है कि मुझे कुछ याद आ रही है।
आपके "आइटम" चर का डेटा प्रकार और इसमें कितने आइटम हैं? –