parBuffer
的documentaion说
parBuffer :: Int -> Strategy a -> Strategy [a]
与evalBuffer相似,但在将列表元素推入缓冲区时会并行评估列表元素。”
evalBuffer :: Int -> Strategy a -> Strategy [a]
evalBuffer是(惰性)列表的滚动缓冲策略组合器。
evalBuffer不像类型建议的那样组成。实际上,它忽略策略自变量r0至少将列表元素评估为弱头范式。”
我的问题的第一部分是,这是否意味着parBuffer
也无视其策略论点?同样,为什么即使它不理会它甚至还会提供一个策略论点呢?
我的问题的第二部分是如何确定parBuffer
使用哪种缓冲区大小?如果parBuffer
始终保持n
的缓冲区大小,除了必须在内存中保留更多火花之外,n=1
和n=10
之间的区别是什么?我当时想选择n=<number of threads>"
可能是明智的选择,但我不知道这会带来什么改善,因为无论何时使用parBuffer
或n=1
,只要消耗了火花,n=4
仍会产生火花。
最佳答案
第一个答案:parBuffer
使用Strategy
评估列表中的一个元素,然后返回Strategy
评估整个列表。是的,它并行评估列表。但是它仍然需要知道如何评估每个项目。 (您想要普通形式还是弱头普通形式还是...?)因此,它不会忽略第一个参数。
第二...基准吗?我怀疑答案取决于每个火花的工作量,您具有的数据依存性等等。