2011-05-26 72 views
7

我只是想测试并行收集了一下,我用下面的代码行(REPL):为什么使用并行集合不会更快?

(1 to 100000).par.filter(BigInt(_).isProbablePrime(100)) 

反对:

(1 to 100000).filter(BigInt(_).isProbablePrime(100)) 

但是水货版本是不是更快。事实上,它甚至感觉有点慢(但我没有真正测量过)。

有没有人对于解释?

编辑1:是的,我有一个多核处理器

编辑2:OK,我“解决”自己的问题。 isProbablePrime的实现似乎是问题,而不是平行集合。我用另一个函数替换isProbablePrime来测试素数,现在我得到了预期的加速比。

+0

并行只有更快,如果它让你获得更多的硬件起动,并且它也有开销。 Scala的设置是为了利用额外的内核? – 2011-05-26 21:18:46

+0

我不知道我必须设置任何东西。你有关于此的更多信息吗? – 2011-05-26 21:27:08

+4

这里没有配置需要; Scala查找可用的内核数量,并将工作委托给适当大小的Fork-Join池。 – 2011-05-26 23:41:42

回答

6

无论是顺序还是并行范围,filter都将生成一个向量数据结构 - 分别为VectorParVector

这是一个已知的问题是那些获得从范围集合生成并行矢量 - 用于并行矢量变压器的方法(如filter)不构造并联载体中。

对此的解决方案,使载体的高效并行建设已经被开发出来,但还没有实现。我建议你提交一个ticket,以便它可以在下一个版本中修复。

+0

我不认为这是问题所在。例如,如果我执行类似'(1到10000).par.filter(x => {Thread.sleep(1); true})'的命令'并行版本比顺序版本快得多。所以并行执行似乎可行,但看起来像isProbablePrime不能同时在多个线程中运行(无论出于何种原因)。 – 2011-05-27 06:20:24

+0

没错 - 是的。但是,在这种情况下,处理每个元素所花费的时间比构造'ParVector'所需的时间要多得多(目前按顺序完成),所以您不会注意到创建该向量所花费的时间。 'isProbablePrime'也应该并行执行,但是,并行运行它的好处应该由最后的顺序构造来掩盖。 – axel22 2011-05-27 07:51:29

+1

我想'isProbablePrime'有同步代码相当大的部分,因为我注意到另一件事是,连续的版本马克塞斯一个核心,但其水货版本相当平均分配负载。我想我应该停止使用'isProbablePrime'来测试并行的东西:) – 2011-05-27 11:08:06

相关问题