2012-09-27 68 views
15

Tôi có một số mã mà tôi hiện đang tối ưu hóa cho đồng thời trong các kiến ​​trúc đa lõi. Trong một lớp học của tôi, tôi đã tìm thấy một vòng lặp foreach lồng nhau. Về cơ bản, vòng lặp ngoài lặp qua một mảng các đối tượng NetworkInterface. Vòng lặp bên trong lặp đi lặp lại mặc dù các giao diện mạng địa chỉ IP.Các vòng Parallel.ForEach lồng nhau

Điều đó khiến tôi suy nghĩ, việc có các vòng lặp Nested Parallel.ForEach nhất thiết phải là một ý tưởng hay không? Sau khi đọc bài viết này (Nested Parallel.ForEach Loops on the same list?) Tôi vẫn không chắc chắn những gì áp dụng ở đâu về hiệu quả và thiết kế song song. Ví dụ này lấy khoảng Parallel.Foreach câu lệnh đang được áp dụng cho danh sách trong đó cả hai vòng lặp đang thực hiện các thao tác trên danh sách đó.

Trong ví dụ của tôi, các vòng được làm những việc khác nhau, vì vậy, nên I:

  1. Sử dụng vòng lặp lồng nhau Parallel.ForEach?
  2. Người dùng Parallel.ForEach trên vòng kết nối gốc và để vòng lặp bên trong như hiện trạng?
+2

Bạn có thể kiểm tra giải pháp bằng Đồng hồ bấm giờ không? Sau đó, bạn sẽ biết nếu nó có giá trị. – mike00

Trả lời

19

Một Parallel.ForEach không nhất thiết phải thực hiện song song - nó chỉ là một yêu cầu để làm như vậy nếu có thể. Do đó, nếu môi trường thực thi không có sức mạnh CPU để thực thi các vòng lặp song song, nó sẽ không làm như vậy.

Nếu các hành động trên các vòng lặp không liên quan (tức là, nếu chúng tách biệt và không ảnh hưởng lẫn nhau), tôi thấy không có vấn đề gì khi sử dụng Parallel.ForEach cả hai vòng bên trong và bên ngoài.

Nó thực sự phụ thuộc vào môi trường thực thi. Bạn có thể thực hiện kiểm tra định thời gian nếu môi trường thử nghiệm của bạn tương tự với môi trường sản xuất, và sau đó xác định phải làm gì. Khi nghi ngờ, hãy kiểm tra ;-)

Chúc may mắn!

+0

Không thể không đồng ý hơn. Có lịch trình đằng sau Parallel.Foreach có thể không sinh ra các chủ đề riêng biệt, nhưng bạn đang nhảy qua rất nhiều chi phí cao hơn của một trong hai luồng, hoặc một bộ lập lịch mà không cần bất kỳ dữ liệu khoa học nào để sao lưu nó. –

+2

@MAfifi: Vui lòng đọc lại câu trả lời của tôi. –

+0

Câu trả lời hay hơn;) –

3

Câu trả lời sẽ phụ thuộc vào;

  1. Bạn đang làm gì với địa chỉ IP khi bạn có?
  2. Mỗi bước mất bao lâu?

Chủ đề không rẻ, chúng cần thời gian để tạo và bộ nhớ tồn tại. Nếu bạn không làm một cái gì đó tính toán đắt tiền với những địa chỉ IP, và sử dụng loại sai của bộ sưu tập để truy cập đồng thời, bạn gần như chắc chắn làm chậm ứng dụng của bạn.

Sử dụng StopWatch để giúp bạn trả lời các câu hỏi này.

+2

Các chủ đề tốn kém để tạo ra, đó chính là lý do tại sao 'Parallel.ForEach()' sử dụng 'ThreadPool', do đó việc tạo các luồng mới có nhiều khả năng sẽ không thành vấn đề. – svick

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