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