scala - 使用 Scalaz 任务时性能下降

标签 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

当我开始这个时,我知道我的机器正在尽我所能做很多工作 在事件监视器中看到,机器风扇也在弹道。 在机器上进行大约两分钟的繁重事件后,工作似乎 正在完成,但我没有得到任何返回值(我希望收集 来自已处理的每个任务的 double )。

我的问题是:

  1. 为什么这比顺序示例花费的时间更长?我更 而不是可能做错了什么,但我看不到。
  2. 为什么我没有从显然正在处理的任务中获得任何返回值集合?

最佳答案

我不确定为什么 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/

相关文章:

带下划线的 Scala 字符串插值

scala - 如何将数据分发到工作节点

scala - 出于 mzero 的目的将案例类视为产品

scala - 如何通过隐式分解类型构造函数?

eclipse - 如何设置 SPARK_LOCAL_IP 地址

scala - 如何将KeyValue列表发送到Kafka?

Scala map2 over tuple with inner monoid (or : how to do this simple thing but better? )

scala - 返回来自 Actor 的 future 消息

Scala:连接 Option[List] 的两个实例

案例类列表中的Scalatest Double等价