[英]ParSeq.fill running sequentially?
我正在嘗試使用並行化在 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
清楚地表明填充方法不是並行運行的。
Scala 中的並行集合庫只能並行化現有集合, fill
尚未實現(可能永遠不會實現)。 如果您想看到速度提升,那么使用Range
生成廉價占位符集合的方法可能是您的最佳選擇。
這是ParSeq.fill
調用的底層方法,顯然不是並行的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.