Leistungsoptimierung der foreach-Schleife in C #

8

Ich habe eine Methode:

%Vor%

DoSomeComplicatedModificationOnNode () gibt in einigen Fällen eine Ausnahme, deshalb wird der catch-Block try {} verwendet - ich kann die Elemente überspringen, die eine Ausnahme ergeben. Die Anzahl der Knoten enthält mehrere tausend Elemente, ein Element hat mehrere Eigenschaften. Wie kann ich diese Schleife optimieren? Ich habe über Parallel.Foreach nachgedacht, aber der folgende Code gibt mir einen Fehler "Fehlender aktueller Prinzipal":

%Vor%     
Steve Macculan 25.04.2014, 09:29
quelle

3 Antworten

9

In C # ist die generische Liste nicht Thread-sicher, daher können Sie keine Elemente in einer parallelen Schleife hinzufügen.

Ich empfehle die Verwendung einer anderen Klasse wie ConcurrentBag , ConcurrentStack oder ConcurrentQueue.

%Vor%

Denken Sie daran, dass parallele Tasks ungeordnet sind. Wenn Sie eine Anweisung wünschen, müssen Sie einen Index in Parallel verwenden. Liste sind nur thead-save zum Lesen.

%Vor%     
Pablo Caballero 25.04.2014 10:03
quelle
3

Ich würde empfehlen, PLINQ für solche Zwecke zu verwenden. Parallele LINQ ist eine parallele Implementierung von LINQ und verfügt über dieselben Operationen. Code, der mit PLINQ geschrieben wurde, folgt funktionalen Stilregeln - es gibt keine Aktualisierungen, nur die Zuordnung der aktuellen Liste im Parallelmodus. Sie können die Leistung für Ihren Fall erhöhen, indem Sie Mapper in verschiedenen Threads ausführen und dann das Ergebnis in einem einzigen "Dataset" zusammenfassen. Natürlich kann es die Leistung nur erhöhen, wenn Sie eine CPU mit wenigen Kernen haben (aber wie üblich heutzutage haben wir alle wenige Kerne).

Hier ist ein Beispiel

%Vor%     
Igor Tkachenko 25.04.2014 10:28
quelle
2

Liste & lt; T & gt; ist in den meisten Fällen nicht threadsicher. Werfen Sie einen Blick auf die Thread-sicheren Sammlungen wie z. ConcurrentBag & lt; T & gt;.

    
gdir 25.04.2014 09:59
quelle