如何在parList和parBuffer之间进行选择?

Fop*_*tin 8 parallel-processing haskell

我从haskell并行性开始,我已经成功地学会了如何使用一些策略:r0, rseq, rdeepseq, parList, parMap.现在我正在寻求更高的效率.所以这是我的问题:parList和之间有什么区别parBuffer?在哪些情况下,每个策略都有效?

Nei*_*own 7

该论文提到了这两个组合器(链接在这里).

parList并行评估所有项目,立即将它们全部设置.我建议当你想要一次使用整个列表时这很有用,例如在map-fold问题中.如果你想评估一堆数字然后求它们,parList用于评估,然后执行总和.

parBuffer评估前n个元素,当你消耗超过它时,它会引发下一个n,依此类推.因此parBuffer,当您要从块开始使用列表时,或者当列表非常大(或无限)时,您将不会对它进行全面评估.例如,如果您想从一些昂贵的计算项目列表中找到前10个答案,您可以使用take 10 . filter fwith parBuffer来并行评估列表中的连续块,直到找到您要查找的前十个项目为止对于.

  • 不完全:`parBuffer`在消耗head元素时计算元素`n + 1`.这意味着你应该总是从消耗缓冲区的任何点获得下一个`n`元素.从链接文章的脚注中可以看出:"人们通常不会在长列表中使用parList,因为会创建太多的火花,而parBuffer往往更实用". (4认同)