Paralelizando tareas

Cada vez son más los equipos que al menos tienen dos núcleos, ahora mismo ya tenemos algunos con cuatro que emulan ocho. Pero no estamos, como desarrolladores, explotando ese potencial.

Imaginaros que tenemos en memoria una lista con cientos de miles de objetos y debemos realizar alguna operación sobre ellos, como cambiar un valor. Nosotros haríamos algo similar a:

foreach (var objeto in lista)
{
    objeto.dato = nuevoValor;
}

Esta instrucción sería equivalente a hacer:

for (int i = 0; i < lista.count; i++)
{
    var objeto = lista[i];
    objeto.dato = nuevoValor;
}

Estas instrucciones tendrían una complejidad O(n), pero solo harían uso de un solo núcleo.

Si estamos usando .NET 4.0, éste nos trae de serie una serie de funciones para paralelizar trabajos y de tal forma que va a repartir las tareas en diferentes núcleos.  No solo eso, sino que si un núcleo tiene capacidad para n tareas también se le pondrán n tareas a él.

Para hacer eso tan solo hay que cambiar un poco la llamada anterior:

lista.AsParallel().ForEach (objeto =>
{
    objeto.dato = nuevoValor;
});

El resultado final es que durante el proceso de ese bucle el procesador se pondrá al 100%, pero la tarea será ejecutada en menos tiempo.

Algunas consideraciones sobre paralelismo:

Debemos tener en cuenta que al realizar un trabajo en paralelo tenemos principalmente tres problemas:

  • Dividir el problema
  • Sincronizar las tareas
  • Unir el problema de nuevo

Todo esto tiene el problema de que supone una carga computacional extra que solamente será “rentable” si el bucle es muy grande. De todas formas en caso de que fuese pequeño debería ser imperceptible estas operaciones, ya que la carga computacional será pequeña de todas formas.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *