2010-02-16 12 views
18

ParallelEnumerable tiene un miembro estático AsParallel. Si tengo un IEnumerable<T> y quiero usar Parallel.ForEach, ¿eso implica que siempre debería estar usando AsParallel?¿Parallel.ForEach requiere AsParallel()

p. Ej. ¿Son ambas correctas (todo lo demás es igual)?

sin AsParallel:

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f)); 

o con AsParallel?

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f)); 

Respuesta

21

Depende de lo que se llame, son problemas independientes.

.AsParallel() Paraleliza la enumeración no la delegación de tareas.

Parallel.ForEach Paralelo al bucle, asignando tareas a hilos de trabajo para cada elemento.

De modo que, a menos que la enumeración de su fuente aumente al convertirse en paralelo (por ejemplo, reader.Match(file) es costoso), son iguales. Para su última pregunta, , ambos también son correctos.

Además, hay otra construcción es posible que desee considerar que acorta un poco, todavía conseguir el máximo beneficio de PLINQ:

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f)); 
+2

Hmmm ... ¿qué es exactamente parrallelizing la enumeración? o al menos, ¿cómo se puede separar esa paralelización de la delegación de tarea? – dkackman

+2

@dkackman '.AsParallel()' prepara la numeración para la ejecución en paralelo, específicamente la versión paralela de '.SelectMany()' en este caso. Piense en una enumeración que tiene una fuerte cláusula 'Donde' pero sin orden, podríamos evaluar esa cláusula where simultáneamente en tantos núcleos como sea posible dando el siguiente en la enumeración al siguiente hilo disponible, haciéndolo casi' n' veces más rápido. Lo que hacemos con ese resultado también se puede manejar de la misma manera después, ya sea de forma síncrona en un subproceso o distribuido en los núcleos como está disponible, esa es la parte 'Parallel.ForEach' o' .ForAll', ¿tiene sentido? –

+0

Eso tiene sentido. Gracias Nick. – dkackman

Cuestiones relacionadas