2010-05-13 21 views
7

Tengo curiosidad sobre las características de rendimiento de Parallel.ForEach. Dado cualquier constructo válido dentro de un bucle Parallel.ForEach, ¿siempre es preferible usar Parallel.ForEach en un bucle foreach? Me pregunto específicamente sobre la sobrecarga de invocar la biblioteca de Tareas paralelas en conjuntos pequeños u otros casos extremos donde un ciclo foreach podría ser más rápido. Sé que la biblioteca es bastante inteligente sobre cuándo/cómo generar hilos ... hay casos en los que es mejor dejar el código en un bucle foreach, o la sobrecarga para llamar a Tareas paralelas generalmente es insignificante, así que si puedes, deberías usar Parallel.ForEach?¿Cuáles son las pautas para Parallel.ForEach vs. foreach?

Esta pregunta es similar y proporciona buena información de diferencia funcional, pero realmente no habla de rendimiento. Tenga en cuenta que estoy haciendo caso omiso de la compatibilidad con .NET < 4 como una razón para quedarse con un foreach:

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

+1

Es posible encontrar algunas respuestas aquí http://www.microsoft.com/downloads/details.aspx?familyid=C3EA8FB5-650D-434B-A216-7E54C53965D1&displaylang=en –

Respuesta

8

No es siempre preferible. Para cuerpos de bucle rápido, Parallel.ForEach puede degradar el rendimiento. Una de las directrices que figuran en Parallel Programming Coding Guidelines es medida antes y después de paralelización.

Otros artículos útiles han sido publicados por parallel computing group.

+0

entiendo y estoy de acuerdo con la medición del rendimiento, pero es Es bueno tener una guía general para comenzar (como su comentario sobre los cuerpos de bucle rápido). El enlace de descargas de @Daniel Straight también tiene algunas cosas buenas en general. http://www.microsoft.com/downloads/details.aspx?familyid=C3EA8FB5-650D-434B-A216-7E54C53965D1&displaylang=en –

+0

1 para hacer referencia a las directrices de programación de codificación paralela. – Steven

2

Yo diría que siempre se quede con lo simple (es decir, foreach regular) y solo implemente cosas más complejas (es decir, Paralelo Paralelo) cuando tenga un requisito mensurable para hacerlo. Entonces, si puede demostrar que en un caso particular el foreach normal no es tan rápido como lo necesita y puede probar para esa instancia particular que el foreach paralelo resolverá su problema, entonces use el Paralelo.

De lo contrario sólo mantenerlo simple.

+3

No estoy de acuerdo con esto, "tan rápido como lo necesite" no es lo mismo "tan rápido como le gustaría al usuario". Deberíamos ver las cosas más frecuentemente a medida que aumenta el número promedio de núcleos. –

Cuestiones relacionadas