我正在寻求提高我正在开发的蒙特卡罗模拟的性能。
我首先做了一个实现,它按顺序按顺序模拟每个路径:
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
当我启动它时,我知道我的机器正在做很多工作 在活动监视器中看到它,机器风扇也在弹道。 在机器上进行了大约两分钟的繁重活动之后,工作似乎就开始了 做完,但我没有得到任何价值(我期待收藏 来自每个已处理任务的双打)。
我的问题是:
答案 0 :(得分:3)
我不确定Task.gatherUnordered
为什么这么慢,但如果你将Task.gatherUnordered
更改为Nondeterminism.gatherUnordered
,一切都会好的:
import scalaz.Nondeterminism
Nondeterminism[Task].gatherUnordered(simulation).run
我将在Github上创建一个关于Task.gatherUnordered
的问题。这肯定应该修复。