我正在尝试使用并行化在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方法没有并行运行。
答案 0 :(得分:1)
Scala中的并行集合库只能并行化现有集合,fill
尚未实现(可能永远不会)。如果您希望看到速度提升,那么使用Range
生成便宜的占位符集合的方法可能是您的最佳选择。
这是ParSeq.fill
调用的基础方法,显然不是平行的。