1

我在 Scala 和简单集合上测试了并行集合,这是我的代码:

def parallelParse()
  {
    val adjs = wn.allSynsets(POS.ADJECTIVE).par
    adjs.foreach(adj => {
      parse(proc.mkDocument(adj.getGloss))
    })
  }

  def serialParse()
  {
    val adjs = wn.allSynsets(POS.ADJECTIVE)
    adjs.foreach(adj => {
      parse(proc.mkDocument(adj.getGloss))
    })
  } 

并行采集速度提高约 3 倍。我在 Scala 中还有什么其他选择可以让它更快地并行运行,我很乐意测试它们并将结果放在这里。

4

1 回答 1

1

您可以使用期货来启动异步计算。你可以这样做:

import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
val futures = wn.allSynsets(POS.ADJECTIVE).map(adj => Future {
  parse(proc.mkDocument(adj.getGloss))
})
futures.foreach(f => Await.ready(f, Duration.Inf))

根据每个元素的工作量allSynsets和元素的数量(元素allSynsets太多 -> 期货太多 -> 更多开销),期货可能会得到更糟糕的结果。

为确保您正确进行基准测试,请考虑使用 ScalaMeter 0.5 的内联基准测试功能:

http://scalameter.github.io/home/gettingstarted/0.5/inline/index.html

您也可以使用演员来实现这一点,但这需要更多的管道。

于 2014-07-07T19:35:33.793 回答