La API Stream se diseñó para facilitar la escritura de cálculos de una manera que se abstraía de cómo se ejecutarían, facilitando el cambio entre secuencial y paralelo.
Sin embargo, solo porque sea fácil, no significa que siempre sea una buena idea, y de hecho, es una mala idea simplemente dejar .parallel()
todo el lugar simplemente porque puedes.
Primero, tenga en cuenta que el paralelismo no ofrece otros beneficios que la posibilidad de una ejecución más rápida cuando hay más núcleos disponibles. Una ejecución paralela siempre implicará más trabajo que una secuencial, porque además de resolver el problema, también debe realizar el despacho y la coordinación de subtareas. La esperanza es que pueda obtener la respuesta más rápido al dividir el trabajo en múltiples procesadores; si esto realmente sucede depende de muchas cosas, incluido el tamaño de su conjunto de datos, cuánto cálculo está haciendo en cada elemento, la naturaleza del cálculo (específicamente, ¿el procesamiento de un elemento interactúa con el procesamiento de otros?) , la cantidad de procesadores disponibles y la cantidad de otras tareas que compiten por esos procesadores.
Además, tenga en cuenta que el paralelismo a menudo también expone el no determinismo en el cálculo que a menudo está oculto por implementaciones secuenciales; a veces esto no importa, o puede mitigarse limitando las operaciones involucradas (es decir, los operadores de reducción deben ser apátridas y asociativos).
En realidad, a veces el paralelismo acelerará su cálculo, a veces no, y a veces incluso lo ralentizará. Lo mejor es desarrollar primero usando la ejecución secuencial y luego aplicar paralelismo donde
(A) usted sabe que en realidad hay un beneficio para un mayor rendimiento
(B) que realmente ofrecerá un mayor rendimiento.
(A) es un problema comercial, no técnico. Si es un experto en rendimiento, generalmente podrá mirar el código y determinar (B), pero la ruta inteligente es medir. (Y ni siquiera se moleste hasta que esté convencido de (A); si el código es lo suficientemente rápido, mejor aplicar sus ciclos cerebrales en otro lugar)
El modelo de rendimiento más simple para el paralelismo es el modelo "NQ", donde N es el número de elementos y Q es el cálculo por elemento. En general, necesita que el producto NQ supere algún umbral antes de comenzar a obtener un beneficio de rendimiento. Para un problema de baja Q como "sumar números del 1 al N", generalmente verá un punto de equilibrio entre N = 1000 y N = 10000. Con problemas de mayor Q, verá los puntos de equilibrio en los umbrales más bajos.
Pero la realidad es bastante complicada. Por lo tanto, hasta que obtenga experiencia, primero identifique cuándo el procesamiento secuencial realmente le está costando algo y luego mida si el paralelismo ayudará.