2012-09-27 35 views
15

Tengo un código que actualmente estoy optimizando para concurrencia en arquitecturas multinúcleo. En una de mis clases, encontré un lazo anidado foreach. Básicamente, el bucle externo itera a través de una matriz de objetos NetworkInterface. El ciclo interno itera a través de las direcciones IP de las interfaces de red.Nested Parallel.ForEach Loops

Me hizo pensar, está teniendo Nidos anidados Parallel.ForEach loops necesariamente una buena idea? Después de leer este artículo (Nested Parallel.ForEach Loops on the same list?), todavía no estoy seguro de qué se aplica en términos de eficiencia y diseño paralelo. Este ejemplo toma aproximadamente Parallel.Foreach sentencias que se aplican a una lista donde ambos bucles realizan operaciones en esa lista.

En mi ejemplo, los bucles están haciendo cosas diferentes, por lo que, en caso de que:

  1. Use bucles anidados Parallel.ForEach?
  2. Usuario Parallel.ForEach en el bucle principal y abandone el bucle interno tal como está?
+2

¿Puedes probar la solución usando el cronómetro? Entonces sabrás si vale la pena. – mike00

Respuesta

19

Un Parallel.ForEach no se ejecuta necesariamente en paralelo; solo es una solicitud para hacerlo si es posible. Por lo tanto, si el entorno de ejecución no tiene la potencia de la CPU para ejecutar los bucles en paralelo, no lo hará.

Si las acciones en los bucles no están relacionadas (es decir, si están separadas y no se influencian entre sí), no veo ningún problema al utilizar Parallel.ForEach en los bucles interno y externo.

Realmente depende del entorno de ejecución. Podría hacer pruebas de tiempo si su entorno de prueba es lo suficientemente similar al entorno de producción, y luego determinar qué hacer. En caso de duda, pruebe ;-)

¡Buena suerte!

+0

No podría estar más en desacuerdo. Sí, es posible que el planificador detrás de Parallel.Foreach no genere hilos separados, pero está saltando muchos más sobrecarga de subprocesos o un planificador sin datos científicos que lo respalden. –

+2

@MAfifi: Lee mi respuesta nuevamente, por favor. –

+0

Mejor respuesta;) –

3

La respuesta será, depende;

  1. ¿Qué estás haciendo con la dirección IP una vez que la tienes?
  2. ¿Cuánto tiempo dura cada paso?

Los hilos no son baratos, tardan en crearse y la memoria existe. Si no está haciendo algo computacionalmente caro con esas direcciones IP, y está utilizando un tipo incorrecto de colección para el acceso simultáneo, es casi seguro que ralentizará su aplicación.

Usa StopWatch para ayudarte a responder estas preguntas.

+2

Los subprocesos son caros de crear, que es exactamente por qué 'Parallel.ForEach()' utiliza el 'ThreadPool', por lo que la creación de nuevos subprocesos probablemente no sea un problema. – svick