簡體   English   中英

ParSeq.fill 按順序運行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM