For Each en Parallel Extensions

En el artículo anterior hemos podido ver como utilizar el bucle For para acelerar la ejecución de cada iteración con Parallel.For, esta claro que cuanto más lento sea el proceso que debe realizar en cada iteración y cuanto mayor sea el número de vueltas del bucle, mayor será la diferencia entre usar los diferentes núcleos del sistema o no utilizarlos.

Otra funcionalidad que provee esta nueva clase, es para acelerar la utilización de For Each, sustituyéndolo por Parallel.ForEach.

En este ejemplo podemos observar como se muestra el listado de ficheros contenidos en C:Windows, realizando una espera de 1 segundo entre cada visualización.

Sub Main()
    Dim sw As Stopwatch
    sw = Stopwatch.StartNew()

    Dim Archivos As String() = Directory.GetFiles("C:Windows")

    For Each Fichero As String In Archivos
        Mostrar(Fichero)
    Next
    Console.WriteLine("Tiempo consumido: " & sw.ElapsedMilliseconds.ToString())

    Console.WriteLine("Pulsa para iniciar...")
    Console.ReadLine()

    sw = Stopwatch.StartNew()

    Parallel.ForEach(Archivos, Function(ip As String) Mostrar(ip))

    Console.WriteLine("Tiempo consumido: " & sw.ElapsedMilliseconds.ToString())
    Console.ReadLine()
End Sub
Function Mostrar(ByVal Fichero As String) As Boolean
    Thread.Sleep(1000)
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() & " " & Fichero)
End Function

Los tiempos obtenidos han sido de 62006 para el bucle “normal” y de 17055 para el bucle con administración automática de tareas, con esto observamos nuevamente la mejora de rendimiento que obtenemos utilizando Parallel Extensions.

Aunque para ver realmente el trabajo que realiza el procesador, deberíamos hacerle trabajar, ya que Thread.Sleep no consume procesador y no se ve claramente los núcleos que utiliza del procesador.

Os propongo que modifiquéis la función Mostrar por está que os pongo a continuación y observéis el Rendimiento de los núcleos.

Function Mostrar(ByVal Fichero As String) As Boolean
    For iC As Integer = 0 To 99999999
    Next
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() & " " & Fichero)
End Function
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s