Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency clojure pmap/preduce vs fork join_Concurrency_Clojure - Fatal编程技术网

Concurrency clojure pmap/preduce vs 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比基于序

看起来像clojure,它看起来像java的fork-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对其他实现友好?