2013-06-04 18 views
12

Ho una collezione enorme che mi piacerebbe elaborare ogni oggetto in modo parallelo. Fare lo stesso in modo sincrono richiede in genere un semplice "foreach".Parallel.ForEach vs AsParallel(). ForAll

Mi chiedo solo cosa usare nel mio scenario, ad esempio Parallel.ForEach o MyCollection.AsParallel(). ForAll().

Riesci a far luce sui vantaggi dell'utilizzo dell'uno contro l'altro.

+1

Questo sembra correlato; http://stackoverflow.com/questions/2270097/does-parallel-foreach-require-asparallel?rq=1 – Patrick

+1

possibile duplicato di [Parallelizzazione di un'attività utilizzando .AsParallel(). For All o Parallel.ForOgni problema di prestazioni] (http: //stackoverflow.com/questions/8415998/parallelizing-a-task-using-asparallel-forall-or-parallel-foreach-performance) – Patrick

risposta

17

Il modo in cui lo vedo, se tutto ciò che si vuole fare è parallelizzare uno foreach, si dovrebbe usare la sua versione parallela, che è Parallel.ForEach().

ParallelEnumerable.ForAll() è per il caso specifico in cui si dispone di una query LINQ seguita da un foreach e si desidera parallelizzarli entrambi. Quindi, quello che fai è che parallelizzi la query LINQ aggiungendo AsParallel() e poi parallelizzi lo foreach cambiandolo in ForAll().

5

Tempo entrambi e scegli il vincitore.

Ho trovato Parallel.ForEach per prestazioni migliori in scenari deliziosamente paralleli. Sembrerebbe che usi un modello di bilanciamento del lavoro più avanzato. PLINQ è principalmente finalizzato alla parallelizzazione delle query.

-2

Hai la possibilità di ordinare gli elementi con AsParallel(). AsOrdered(). Ordinare in Parallel.ForEach non è fuori dalla scatola, abbiamo bisogno di farlo.

1

I miei 2 centesimi:

Con ForAll è possibile specificare il livello desiderato di parallelismo con il metodo WithDegreeOfParallelism estensione.

Con ForEach è possibile limitare solo il livello massimo.

Fondamentalmente, è possibile forzare ForAll per utilizzare più thread.

Problemi correlati