2012-09-01 19 views
5

किस परिदृश्य में रेंज विभाजन चंक विभाजन से बेहतर विकल्प होगा? (और शिकंजा कविता)Plinq की रेंज विभाजन बनाम खंड विभाजन?

मैं पहले से ही पता है कि

  • हिस्सा विभाजन: प्रक्रिया के लिए इनपुट से तत्वों का smal हिस्सा हथियाने, वह तो छोटे-छोटे टुकड़ों के साथ शुरू होता है, हिस्सा आकार बढ़ जाता है। (100000 तक रूढ़ अंक पाने के)

    IEnumerable<int> numbers = Enumerable.Range (3, 100000-3); 
    var parallelQuery = from n in numbers.AsParallel() 
             where Enumerable.Range (2, (int) Math.Sqrt (n)).All (i => n % i > 0) 
             select n; 
    

    सकता खराब करते हैं:

  • रेंज विभाजन प्रत्येक कार्यकर्ता

इसके अलावा, क्यों इस कोड को तत्वों की संख्या बराबर preallocates श्रेणी विभाजन के साथ?

इस कोड को एक ओर जहां: (प्रथम लाख नंबरों की sqrt की राशि पाने के)

ParallelEnumerable.Range (1, 10000000).Sum (i => Math.Sqrt (i)) 

बेहतर एक बेहतर विकल्प रेंज विभाजन के साथ उपयोग करने के लिए होगा?

उत्तर

5

पहले नमूने में, प्रति आइटम आवश्यक टीएम n पर निर्भर करता है। 90000 के बाद अगले प्राइम नंबर की तलाश में 1100 के बाद एक को खोजने से अधिक समय लगता है।

परिणामस्वरूप, जब समान श्रेणियों में विभाजित किया गया है, तो आखिरी श्रेणियों को पहले की तुलना में अधिक काम करना होगा।

दूसरे नमूने में समय-प्रति-ऑपरेशन पूरी श्रृंखला के बराबर है। तो विभाजन विभाजन अच्छी तरह से काम करेगा।

+0

हाय @ हेनक धन्यवाद। तो क्या मेरे लिए यह तय करने के लिए कोई अंगूठा नियम है कि किस का उपयोग करना है? –

+1

जब आप समान वितरण की अपेक्षा करते हैं, तो रेंज विभाजन का उपयोग करें। जब यह अज्ञात होता है (और असमान वितरण का जोखिम होता है), तो टुकड़ों का उपयोग अधिक अनुकूली होगा। –

+0

दृश्यों के पीछे हेनक, वितरण बराबर है या नहीं, तो इससे क्या फर्क पड़ता है? दोनों परिस्थितियों में, एक काम है .... क्या कोई ऐसी चीज है जो _Range_ में किया गया है और _Chunk_ में नहीं है (या कुछ और?)? –

संबंधित मुद्दे