我希望提高我正在开发的蒙特卡罗模拟的性能。
我首先做了一个实现,它按如下顺序模拟每条路径:
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
当我开始这个时,我知道我的机器正在尽我所能做很多工作 在事件监视器中看到,机器风扇也在弹道。 在机器上进行大约两分钟的繁重事件后,工作似乎 正在完成,但我没有得到任何返回值(我希望收集 来自已处理的每个任务的 double )。
我的问题是:
- 为什么这比顺序示例花费的时间更长?我更 而不是可能做错了什么,但我看不到。
- 为什么我没有从显然正在处理的任务中获得任何返回值集合?
最佳答案
我不确定为什么 Task.gatherUnordered
这么慢,但是如果您将 Task.gatherUnordered
更改为 Nondeterminism.gatherUnordered
一切都会没事的:
import scalaz.Nondeterminism
Nondeterminism[Task].gatherUnordered(simulation).run
我将在 Github 上创建一个关于 Task.gatherUnordered
的问题。这绝对应该修复。
关于scala - 使用 Scalaz 任务时性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32392147/