scala - scala 并行收集处理的性能

标签 scala parallel-processing scala-collections

我有需要一次处理数千条记录的场景。有时,可能有数百条记录,也可能多达 30000 条记录。我正在考虑使用 Scala 的并行集合。所以只是为了理解差异,我写了一个简单的 pgm,如下所示:

object Test extends App{
  val list = (1 to 100000).toList
  Util.seqMap(list)
  Util.parMap(list)
}

object Util{
  def seqMap(list:List[Int]) = {
    val start = System.currentTimeMillis
    list.map(x => x + 1).toList.sum
    val end = System.currentTimeMillis
    println("time taken =" + (end - start))
    end - start
  }
  def parMap(list:List[Int]) = {
    val start = System.currentTimeMillis
    list.par.map(x => x + 1).toList.sum
    val end = System.currentTimeMillis
    println("time taken=" + (end - start))
    end - start
  }
}

我预计并行运行会更快。但是,我得到的输出是
time taken =32
time taken=127

机器配置 :
Intel i7 processor with 8 cores
16GB RAM
64bit Windows 8

我究竟做错了什么?这不是并行映射的正确场景吗?

最佳答案

问题是您正在执行的操作非常快(只需添加两个整数),以至于进行并行化的开销大于 yield 。只有在操作速度较慢时,并行化才真正有意义。

可以这样想:如果你有 8 个 friend ,你在一张纸上给每个人一个整数,并告诉他们加一个,把结果写下来,然后还给你,你会在给他们之前记录下来下一个整数,您将花费大量时间来回传递消息,以至于您可以自己更快地完成所有添加。

另外:从不做 .par在 List 上,因为并行化过程必须将整个列表复制到并行集合中,然后将整个内容复制回来。如果您使用 Vector,那么它就不必做这些额外的工作。

关于scala - scala 并行收集处理的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28497786/

相关文章:

scala - Scala 中的 JavaConverters 和 JavaConversions 有什么区别?

scala - mapValues和Map中的transform之间的区别

Scala:最有效的简单迭代集合

mongodb - 为什么reactivemongo的collection.save()会执行get()?

scala - Akka 2.1 异常处理(Scala)

c# - 最多有 N 个线程按 FIFO 顺序执行的代码部分

python - 处理来自 asyncmap 的结果

scala - 用 for-comprehension 替换 flatMap/map 链

scala - `implicit' 修饰符不能用于顶级对象

programming-languages - 2010 年的 IBM Cell 编程——可行且值得吗?