2012-05-02 20 views
5

He estado aprendiendo un poco sobre el paralelismo en los últimos días, y me encontré con el ejemplo this.¿Por qué la versión paralela fue más lenta que la versión secuencial en este ejemplo?

lo puse de lado a lado con una secuencia de bucle de la siguiente manera:

private static void NoParallelTest() 
{ 
    int[] nums = Enumerable.Range(0, 1000000).ToArray(); 
    long total = 0; 
    var watch = Stopwatch.StartNew(); 
    for (int i = 0; i < nums.Length; i++) 
    { 
     total += nums[i]; 
    } 
    Console.WriteLine("NoParallel"); 
    Console.WriteLine(watch.ElapsedMilliseconds); 
    Console.WriteLine("The total is {0}", total); 
} 

Me sorprendió ver que el método NOPARALLEL terminó modo mucho más rápido que el ejemplo dado en paralelo en el sitio.

Tengo una PC i5.

Realmente pensé que el método Paralelo terminaría más rápido.

¿Hay una explicación razonable para esto? ¿Tal vez malentendí algo?

+1

¿Puede confirmar que la versión paralela funcionó con varios núcleos? ¿Y qué ocurre cuando aumenta el número de iteraciones (mayor "Rango")? – chrisaycock

+6

Asumiendo que la versión paralela se ejecutó en múltiples núcleos, simplemente puede mostrar cuánto puede tener la sincronización de subprocesos ... especialmente en una pieza trivial de código. – Oded

+0

Parafraseando a Mark Twain; * "Hay mentiras, malditas mentiras, estadísticas y puntos de referencia ..." * –

Respuesta

10

La versión secuencial fue más rápida porque el tiempo dedicado a realizar operaciones en cada iteración en su ejemplo es muy pequeño y hay una sobrecarga bastante significativa involucrada en la creación y administración de múltiples hilos.

La programación en paralelo solo aumenta la eficiencia cuando cada iteración es lo suficientemente cara en términos de tiempo del procesador.

2

Creo que es porque el bucle realiza una operación muy simple y muy rápida.

En el caso de la versión no paralela eso es todo lo que hace. Pero la versión paralela tiene que invocar a un delegado. Invocar a un delegado es bastante rápido y por lo general no tienes que preocuparte de la frecuencia con la que lo haces. Pero en este caso extremo, es lo que hace la diferencia. Puedo imaginar fácilmente que invocar a un delegado será, por ejemplo, diez veces más lento (o más, no tengo idea de cuál es la proporción exacta) que agregar un número de una matriz.

2

No está comparando manzanas con naranjas.

El ejemplo se vincula a que no se trata de paralelismo o de concurrencia tanto como se trata de desconectar el estado de ser compartida amoung los diferentes hilos. El trabajo que está haciendo es un hombre de paja solo para mostrar que algo se está haciendo.

Entonces, lo que está comparando es como comparar un auto F1 con un Top Fuel Dragster. Cada uno sobresale yendo a rápido, pero rápido es relativo al contexto que en este y la mayoría de los casos es altamente especializado. Ninguno de los dos puede competir en los demás bailía altamente especializada.

lecciones que aprender

  • concurrente! = Más rápido
  • puntos de referencia mal concebidas engañar
Cuestiones relacionadas