2011-05-17 4 views
25

Aquí está el código:Parallel.ForEach lento que el ParaCada

El problema es, Parallel.ForEach toma alrededor de 400 ms vs un habitual foreach, que dura aproximadamente 40 ms. ¿Qué estoy haciendo exactamente mal y por qué esto no funciona como lo espero?

+8

Básicamente porque hay un costo de instalación involucrado, y no está haciendo suficiente trabajo dentro del ciclo para justificar la sobrecarga. Ver p. [esta respuesta] (http: // stackoverflow.com/questions/2828429/what-are-the-guidelines-for-parallel-foreach-vs-foreach/2828486 # 2828486). (Espero que esta sea una pregunta duplicada.) – Rup

+2

La 'Console.WriteLine()' lo hace totalmente irrelevante. –

+0

Intenta eliminar 'Console.WriteLine()' y reemplázalo con 'c.FirstName = c.FirstName.ToLowerInvariant()'. No verá una diferencia si su colección tiene alrededor de 5000 artículos; pero si su colección tiene 6000, 7000, ... 10,000 artículos, en un procesador de 4 núcleos, verá una gran diferencia ('Parallel.Foreach' será más rápido) –

Respuesta

127

Supongamos que tiene una tarea que realizar. Digamos que eres un profesor de matemáticas y tienes veinte papeles para calificar. Le toma dos minutos calificar un papel, por lo que le tomará unos cuarenta minutos.

Supongamos ahora que decide contratar algunos asistentes para ayudarlo a calificar los trabajos. Te lleva una hora localizar a cuatro asistentes. Cada uno toma cuatro documentos y todo está listo en ocho minutos. Has cambiado 40 minutos de trabajo por 68 minutos totales de trabajo, incluida la hora extra para encontrar a los asistentes, por lo que no es un ahorro. La sobrecarga de encontrar a los asistentes es mayor que el costo de hacer el trabajo usted mismo.

Supongamos que tiene veinte mil papeles para nivelar, por lo que le tomará unos 40000 minutos. Ahora, si pasas una hora buscando ayudantes, es una victoria. Cada uno de ustedes toma 4000 documentos y lo hacen en un total de 8060 minutos en lugar de 40000 minutos, un ahorro de casi un factor de 5. La sobrecarga de encontrar asistentes es básicamente irrelevante.

Paralelización es no gratis. El costo de dividir el trabajo entre los diferentes hilos debe ser pequeño en comparación con la cantidad de trabajo realizado por cada hilo.

Más información:

https://en.wikipedia.org/wiki/Amdahl%27s_law

https://en.wikipedia.org/wiki/Gustafson%27s_law

+9

¿Podría señalar algún material de lectura que discuta cómo se trataría de calcular el punto en el que es factible asumir los gastos generales para completar una tarea? – Thelonias

8

Lo primero que debe tener en cuenta es que no todo el paralelismo es beneficioso. Hay una cantidad de sobrecarga al paralelismo, y esta sobrecarga puede o no ser significativa dependiendo de la complejidad a la que se está paralelizando. Como el trabajo en su función paralela es muy pequeño, la sobrecarga de la gestión que tiene que hacer el paralelismo se vuelve significativa, lo que ralentiza el trabajo general.

+1

+1 - ¡Solo un poco más rápido que yo! – Tejs

8

La sobrecarga adicional de crear todos los subprocesos para su VS enumerable simplemente ejecutando el numerable es más que probable la causa de la desaceleración. Parallel.ForEach no es un movimiento de aumento de rendimiento general; necesita ser pesado ya sea que la operación que se completará para cada elemento sea o no bloqueable.

Por ejemplo, si hiciera una solicitud web o algo así en lugar de simplemente escribir en la consola, la versión paralela podría ser más rápida. Tal como está, simplemente escribir en la consola es una operación muy rápida, por lo que la sobrecarga de crear los hilos y comenzarlos será más lenta.

3

Como escritor anterior ha dicho que hay algo de sobrecarga asociada con Parallel.ForEach, pero eso no es por lo que no puede ver su mejora del rendimiento. Console.WriteLine es una operación síncrona, por lo que solo funciona un subproceso a la vez. Intenta cambiar el cuerpo a algo que no sea bloqueador y verás que el rendimiento aumenta (siempre que la cantidad de trabajo en el cuerpo sea lo suficientemente grande como para superar la sobrecarga).

Cuestiones relacionadas