viernes, 2 de diciembre de 2016

Java Streams 2/2

Con las nuevas arquitecturas multinúcleo de los procesadores, si queremos que nuestros programas sean eficientes, debemos ofrecer la posibilidad de que tengan concurrencia (cuando 2 tareas corren en períodos de tiempo que se solapan) y paralelismo (cuando 2 tareas se ejecutan simultáneamente en nucleos distintos). Por tanto puede darse el caso que 2 tareas se esten ejecutando concurrentement en un mismo núcleo (fragmentadas en trocitos que se van alternando su ejecución), pero estando el segundo núcleo desaprovechado, por tanto sin paralelismo.

También se puede hablar de paralelismo de proceso y paralelismo de datos. Un ejemplo del primero puede ser un servidor de aplicaciones donde se pueden conectar varos usuarios en conexiones "http". En paralelismo de datos, un nucleo se encarga de procesar un subconjuto de datos y el otro núcleo del resto.
Cuando se crean algoritmos con paralelismo, suele suceder que son mas lentos ya que requieren recursos adicionales para repartir el trabajo entre los procesadores y luego ensamblar el resultado. Por tanto. Pero cuando el trabajo a realizar afecta una colección grande, y se dispone de un procesador con varios núcleos, la cosa cambia.

En Java 8, tenemos el "parallelStream" como version con paralelismo del "stream".

También hay funciones de paralelismo para Arrays como :

parallelPrefix : Ejecuta una función matemática sobre los elementos del array.
parallelSetAll : Actualiza los valores del array mediante un Lambda.
parallelSort : Ordena los elementos.

1. Reglas de uso del paralelismo en streams

1. El valor inicial de la funcion reduce debe ser elemento neutro. Para la suma será el "0" y para el producto el "1"

  .reduce(0, (suma, elemento) -> suma + elemento);

o
  .reduce(1, (producto, elemento) -> producto * elemento);


2. La función de combinación debe cumplir la propiedad asociativa. En nuestro caso anterior se verifica tanto para la suma como para el producto.

  (1 + 3) + 5 = 1 + (3 + 5) = 9

  (1 * 3) * 5 = 1 *  (3 * 5) = 15

3. Cuando en un se evalua un "stream pipeline", solamente puede haber un modo, o parelelo o secuencial y no los dos a la vez. Si huebiera llamadas tanto secuenciales como paralelas, todo se ejecuta secuencialmente.


No hay comentarios :

Publicar un comentario