使用Scalaz任务时性能下降

时间:2015-09-04 07:11:18

标签: scala scalaz

我正在寻求提高我正在开发的蒙特卡罗模拟的性能。

我首先做了一个实现,它按顺序按顺序模拟每个路径:

def simulate() = {
  for (path <- 0 to 30000) {
    (0 to 100).foreach(
      x => // do some computation
    )    
  }
}

这基本上模拟30,000个路径,每个路径有100个离散的随机步骤。

上述功能在我的机器上运行非常快(大约1秒),用于我正在进行的计算。

然后我考虑通过使代码以多线程方式运行来进一步加快速度。

我决定使用Task来编写以下代码:

val simulation = (1 |-> 30000 ).map(n => Task {
  (1 |-> 100).map(x => // do some computation)
  })

然后我按如下方式使用它:

Task.gatherUnordered(simulation).run

当我启动它时,我知道我的机器正在做很多工作 在活动监视器中看到它,机器风扇也在弹道。 在机器上进行了大约两分钟的繁重活动之后,工作似乎就开始了 做完,但我没有得到任何价值(我期待收藏 来自每个已处理任务的双打)。

我的问题是:

  1. 为什么这比连续的例子要花费更长的时间?我更多 可能做错了但我无法看到它。
  2. 为什么我没有从显然正在处理的任务中获得任何返回的值集合?

1 个答案:

答案 0 :(得分:3)

我不确定Task.gatherUnordered为什么这么慢,但如果你将Task.gatherUnordered更改为Nondeterminism.gatherUnordered,一切都会好的:

import scalaz.Nondeterminism

Nondeterminism[Task].gatherUnordered(simulation).run

我将在Github上创建一个关于Task.gatherUnordered的问题。这肯定应该修复。