2011-03-18 20 views
7

Estoy empezando en el paralelismo de Haskell, he aprendido con éxito cómo usar algunas estrategias como: r0, rseq, rdeepseq, parList, parMap. Ahora estoy buscando más eficiencia. Así que aquí está mi pregunta: ¿Cuál es la diferencia entre parList y parBuffer? ¿En qué casos cada estrategia es eficiente?¿Cómo elegir entre parList y parBuffer?

Respuesta

8

El documento menciona estos dos combinadores (link here).

parList evalúa todos los elementos en paralelo, configurándolos todos a la vez. Sugeriría que esto sea útil cuando quiera consumir toda la lista a la vez, por ejemplo, en un problema de pliegue de mapa. Si desea evaluar un grupo de números y luego sumarlos, use parList para la evaluación, luego realice la suma.

evalúa los primeros n elementos, y cuando se consume más allá, se activa el n siguiente, y así sucesivamente. Entonces, parBuffer tiene sentido cuando vas a consumir la lista en fragmentos, empezando por el principio, o cuando la lista es muy grande (o infinita) y no la evaluarás por completo. Por ejemplo, si quiere encontrar las primeras 10 respuestas de una lista de artículos costosos para calcular, puede usar take 10 . filter f con parBuffer para evaluar en paralelo trozos consecutivos de la lista hasta que encuentre los primeros diez elementos que ' que estas buscando.

+3

No exactamente: 'parBuffer' evalúa el elemento' n + 1' cuando se consume el elemento principal. Esto significa que siempre debe tener los siguientes elementos 'n' disponibles desde cualquier punto que consuma el búfer. De una nota a pie de página en el documento vinculado: "Uno normalmente no usaría parList en listas largas ya que se crearían demasiadas chispas, en cambio parBuffer tiende a ser más práctico". –

Cuestiones relacionadas