2009-11-28 6 views
6

यह निम्न परीक्षण कार्यक्रम के लिए squat ऐसा प्रतीत नहीं होता है। क्या ऐसा इसलिए है क्योंकि मैं एक छोटी सूची के साथ परीक्षण कर रहा हूं?AsParallel वास्तव में कैसे काम करता है?

static void Main(string[] args) 
{ 
    List<int> list = 0.UpTo(4); 

    Test(list.AsParallel()); 
    Test(list); 
} 

private static void Test(IEnumerable<int> input) 
{ 
    var timer = new Stopwatch(); 
    timer.Start(); 
    var size = input.Count(); 
    if (input.Where(IsOdd).Count() != size/2) 
     throw new Exception("Failed to count the odds"); 

    timer.Stop(); 
    Console.WriteLine("Tested " + size + " numbers in " + timer.Elapsed.TotalSeconds + " seconds"); 
} 

private static bool IsOdd(int n) 
{ 
    Thread.Sleep(1000); 
    return n%2 == 1; 
} 

दोनों संस्करणों को चलाने के लिए 4 सेकंड लगते हैं।

+2

आप एक विस्तार विधि तक कैसे पहुंचे? – thewpfguy

उत्तर

23

कार्य समांतर पुस्तकालय अनुक्रम के स्थिर प्रकार के बारे में परवाह करता है। टीपीएल द्वारा संचालित संचालन के लिए IParallelEnumerable<T> होना चाहिए। जब आप Test पर कॉल करते हैं तो आप संग्रह को IEnumerable<T> पर कास्टिंग कर रहे हैं। इसलिए, संकलक .Where को टीपीएल द्वारा प्रदान किए गए समांतर संस्करण की बजाय System.Linq.Enumerable.Where एक्सटेंशन विधि के अनुक्रम पर कॉल करेगा।

1

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

5

(.NET4 के लिए अद्यतन कर रहा है के बाद से यह सवाल AsParallel लिए एक Google खोज में बहुत उच्च() में शुमार है)

बस कुछ परिवर्तन के रूप में मुझे लगता है कि आप की उम्मीद अपने उदाहरण काम करने के लिए अनुमति देगा।

List<int> list = 0.UpTo(4);var list = Enumerable.Range(0, 4); को

यदि आप एक हस्ताक्षर है कि एक ParallelQuery लेता है के साथ एक समारोह अधिभार जोड़ा आपका उदाहरण काम करेगा बदलें ...

private static void Test(ParallelQuery<int> input) 
    { 
     var timer = new Stopwatch(); 
     timer.Start(); 

     int size = input.Count(); 
     if (input.Where(IsOdd).Count() != size/2) 
     { 
      throw new Exception("Failed to count the odds"); 
     } 
     timer.Stop(); 

     Console.WriteLine("Tested " + size + " numbers in " + timer.Elapsed.TotalSeconds + " seconds"); 
    } 

वैकल्पिक रूप से, आप LINQ वाक्यविन्यास इस्तेमाल कर सकते हैं ....

private static void Test(ParallelQuery<int> list) 
    { 
     var timer = Stopwatch.StartNew(); 

     if ((from n in list.AsParallel() 
      where IsOdd(n) 
      select n).Count() != (list.Count()/2)) 
     { 
      throw new Exception("Failed to count the odds"); 
     } 

     Console.WriteLine("Tested " + list.Count() + " numbers in " + timer.Elapsed.TotalSeconds + " seconds"); 
    } 

उम्मीद है कि इससे किसी की मदद मिलती है!