Discutiendo sobre la proliferación de núcleos en los procesadores y como sacarle más provecho, os introduzco a la inicialización de colecciones con ‘Query’s’ en Linq utilizando el pragma ‘asParallel’ de esa forma podemos añadir ese atractivo «Extra» a funciones que normalmente dejan que decir por la falta de agilidad al ejecutarse.
' Ejemplo de inicializacion de Query's paralelas
' En este caso usando una coleccion de respuestas sobre una peticion de ping.
' Pep Lluis 2010
Module Module1
Sub Main()
'Si el sistema dispone de mas de un nucleo
If System.Environment.ProcessorCount > 1 Then
'Definir una lista de IP's... por ejemplo :
Dim Ips = {"localhost", "192.168.1.2", "192.168.1.3"}
'Construccion de la Linq parallel query
Dim PingP = From ip In Ips.AsParallel
Select New System.Net.NetworkInformation.Ping().Send(ip)
Dim asParallel As DateTime = DateTime.Now 'Tomar tiempo de incio proceso
'Procesar las respuestas
ProcessPings(PingP)
'Mostrar el tiempo empleado (Desde el inicio hasta el proceso de respuestas)
Console.WriteLine("Tiempo empleado, usando 'AsParallel' : {0}", DateTime.Now - asParallel)
'Query sin 'asParallel'
Dim PingS = From ip In Ips
Select New System.Net.NetworkInformation.Ping().Send(ip)
Dim noParallel As DateTime = DateTime.Now 'Tomar Tiempo de Inicio
ProcessPings(PingS)
Console.WriteLine("Tiempo Empleado sin Parallel Query : {0}", DateTime.Now - noParallel)
Else
Console.WriteLine("No se puede realizar el test con un solo nucleo.")
End If
Console.ReadLine()
End Sub
'Procesar respuestas
Sub ProcessPings(ByVal Pings)
For Each ping In Pings
Console.WriteLine("{0} : {1}", ping.Status, ping.Address)
Next
End Sub
End Module
Espero vuestas opiniones,
Pep Lluis,
I have this post in English version, no doubt in contact with me if needed.