Concurrency clojure pmap/preduce vs fork join
看起来像clojure,它看起来像java的fork-join框架上的函数包装器Concurrency clojure pmap/preduce vs fork join,concurrency,clojure,Concurrency,Clojure,看起来像clojure,它看起来像java的fork-join框架上的函数包装器 我想知道它们和pmap/preduce之间的区别是什么?从代码来看,它们的功能基本相同-唯一的区别是pmap使用代理线程池上运行的期货作为底层原语,而pvmap使用fork-join 我不能肯定地说,但我希望在一般情况下,无论哪一个性能更好,都会成为pmap的标准实现,除非有足够多的重大折衷使两者都值得 它看起来(至少现在)fork-join框架只支持向量,所以它不是半惰性的,就像pmapfork-join比基于序
我想知道它们和pmap/preduce之间的区别是什么?从代码来看,它们的功能基本相同-唯一的区别是
pmap
使用代理线程池上运行的期货作为底层原语,而pvmap
使用fork-join
我不能肯定地说,但我希望在一般情况下,无论哪一个性能更好,都会成为pmap
的标准实现,除非有足够多的重大折衷使两者都值得
它看起来(至少现在)fork-join框架只支持向量,所以它不是半惰性的,就像
pmap
fork-join比基于序列的pmap
/preduce
,应该允许对并行性进行更细粒度的控制。实现这一点的确切API仍然悬而未决。据我所知,一个区别是,pmap
只会在给定的“块度”下运行。函数映射到给定给pmap
的序列的每个成员上。如果粒度太小,那么并行的潜在好处就会被创建和管理太多的Future
s的开销所吞噬
Fork-join支持工作窃取,因此每个线程上的运行量可以自适应 无论是pmap还是pvmap都不会使我们不必使用正确的块大小。对于我的项目来说,这通常意味着将数据分成块,并在每个块上使用map,然后使用pmap并行映射块。然后缩小并展平。这些幻灯片包含一些图表,显示了两种方法之间的比较:这将是Clojure conj会议上的一个话题:David liebke正在积极为下一版本的clojure@Alex正是这个摘要引发了这样一个问题:)。有人考虑过ClojureCLR上fork-join的实现策略,还是确保fork-join API对其他实现友好?