2009-11-28 39 views
6

Nó dường như không làm squat cho chương trình thử nghiệm sau đây. Đây có phải là vì tôi đang thử nghiệm với một danh sách nhỏ không?AsParallel hoạt động chính xác như thế nào?

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; 
} 

Cả hai phiên bản đều mất 4 giây để chạy.

+2

Làm cách nào bạn nhận được Upto, một phương pháp khuyến nông? – thewpfguy

Trả lời

23

Thư viện song song tác vụ quan tâm đến loại tĩnh tĩnh của chuỗi. Nó phải là IParallelEnumerable<T> để các hoạt động được xử lý bởi TPL. Bạn đang truyền bộ sưu tập trở lại IEnumerable<T> khi bạn gọi Test. Do đó, trình biên dịch sẽ giải quyết .Where gọi theo thứ tự đến System.Linq.Enumerable.Where phương thức mở rộng thay vì phiên bản song song do TPL cung cấp.

1

Khi hoạt động song song bằng cách đặt nội dung của bạn vào ThreadPool. Ngoài ra, bạn có bao nhiêu lõi? Nếu bạn đang làm việc trên một máy tính cốt lõi duy nhất mà vẫn sẽ mất khoảng 4s để chạy.

5

(Cập nhật cho .NET4 kể từ khi câu hỏi này đứng khá cao trong một tìm kiếm Google cho AsParallel())

Chỉ cần một vài thay đổi này sẽ cho phép ví dụ của bạn để làm việc như tôi tưởng tượng bạn mong đợi.

Thay đổi List<int> list = 0.UpTo(4);-var list = Enumerable.Range(0, 4);

dụ của bạn sẽ làm việc nếu bạn thêm một chức năng quá tải với một chữ ký mà phải mất một 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"); 
    } 

Ngoài ra, bạn có thể sử dụng cú pháp 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"); 
    } 

Hy vọng điều này sẽ giúp ai đó!

Các vấn đề liên quan