2010-05-13 6 views
7

Ich bin gespannt auf die Leistungsmerkmale von Parallel.ForEach. Ist es angesichts eines gültigen Konstrukts innerhalb einer Parallel.ForEach-Schleife immer vorzuziehen, Parallel.ForEach über eine foreach-Schleife zu verwenden? Ich wundere mich speziell über den Overhead des Aufrufs der Parallel Tasks-Bibliothek in kleinen Sets oder anderen Edge-Fällen, wo eine foreach-Schleife schneller sein könnte. Ich weiß, dass die Bibliothek sehr schlau ist, wann/wie man Threads spawnt ... Gibt es Fälle, wo es besser ist, Code in einer foreach-Schleife zu belassen, oder ist der Overhead für den Aufruf von Parallel Tasks generell vernachlässigbar, also wenn du kannst, solltest du Verwenden Sie Parallel.ForEach?Was sind die Richtlinien für Parallel.ForEach vs. foreach?

Diese Frage ist ähnlich und bietet einen guten funktionalen Unterschied Informationen, aber spricht nicht wirklich zur Leistung. Beachten Sie, dass ich ignoriere Kompatibilität zu .NET < 4 als Grund für die mit einer foreach bleiben:

C#: Any benefit of List<T>.ForEach(...) over plain foreach loop?

+1

Sie könnten einige Antworten hier finden http://www.microsoft.com/downloads/details.aspx?familyid=C3EA8FB5-650D-434B-A216-7E54C53965D1&displaylang=en –

Antwort

8

Es ist nicht immer besser. Bei schnellen Schleifenkörpern kann Parallel.ForEach die Leistung beeinträchtigen. Eine der in Parallel Programming Coding Guidelines aufgeführten Richtlinien ist Maßnahme vor und nach der Parallelisierung.

Weitere nützliche Artikel wurden von der parallel computing group veröffentlicht.

+0

ich mit der Messung der Leistung verstehen und stimmen zu, aber es ist Es ist schön, eine allgemeine Richtlinie zu haben, um damit zu beginnen (wie Ihr Kommentar zu schnellen Schleifenkörpern). Der Download-Link von @Daniel Straight hat auch einige gute allgemeine Sachen. http://www.microsoft.com/downloads/details.aspx?familyid=C3EA8FB5-650D-434B-A216-7E54C53965D1&displaylang=en –

+0

+1 zum Verweisen auf die Programmierrichtlinien für die parallele Programmierung. – Steven

2

Ich würde sagen, immer mit einfachen (d. H. Regulären foreach) bleiben und nur komplexere Sachen (d. H. Parallel ForEach) implementieren, wenn Sie eine messbare Anforderung haben, dies zu tun. Wenn Sie also beweisen können, dass in einem bestimmten Fall die normale foreach nicht so schnell ist, wie Sie brauchen, und Sie für diese bestimmte Instanz beweisen können, dass die parallele foreach Ihr Problem lösen wird, dann verwenden Sie die Parallele.

Ansonsten behalte es einfach.

+3

Ich stimme damit nicht überein, "so schnell du brauchst" ist nicht gleich "so schnell, wie der Nutzer es möchte". Wir sollten die Dinge häufiger betrachten, wenn die durchschnittliche Anzahl der Kerne steigt. –

Verwandte Themen