ParSeq.fill顺序运行?

时间:2015-06-23 20:33:12

标签: scala parallel-processing scala-collections

我正在尝试使用并行化在Scala中初始化数组。但是,使用ParSeq.fill方法时,性能似乎比顺序初始化(Seq.fill)更好。如果我执行相同的任务,但使用map初始化集合,则速度会快得多。

为表明我的观点,我设置了以下示例:

import scala.collection.parallel.immutable.ParSeq
import scala.util.Random

object Timer {
  def apply[A](f: => A): (A, Long) = {
    val s = System.nanoTime
    val ret = f
    (ret, System.nanoTime - s)
  }
}

object ParallelBenchmark extends App {

  def randomIsPrime: Boolean = {
    val n = Random.nextInt(1000000)
    (2 until n).exists(i => n % i == 0)
  }

  val seqSize = 100000

  val (_, timeSeq) = Timer { Seq.fill(seqSize)(randomIsPrime) }
  println(f"Time Seq:\t\t $timeSeq")
  val (_, timeParFill) = Timer { ParSeq.fill(seqSize)(randomIsPrime) }
  println(f"Time Par Fill:\t $timeParFill")
  val (_, timeParMap) = Timer { (0 until seqSize).par.map(_ => randomIsPrime) }
  println(f"Time Par map:\t $timeParMap")

}

结果是:

Time Seq:        32389215709
Time Par Fill:   32730035599
Time Par map:    17270448112 

清楚地显示fill方法没有并行运行。

1 个答案:

答案 0 :(得分:1)

Scala中的并行集合库只能并行化现有集合,fill尚未实现(可能永远不会)。如果您希望看到速度提升,那么使用Range生成便宜的占位符集合的方法可能是您的最佳选择。

这是ParSeq.fill调用的基础方法,显然不是平行的。

相关问题