scala并行采集处理的性能

Yad*_*nan 5 parallel-processing scala 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
  }
}
Run Code Online (Sandbox Code Playgroud)

我预计并行运行会更快.但是,我得到的输出是

time taken =32
time taken=127
Run Code Online (Sandbox Code Playgroud)

机器配置:

Intel i7 processor with 8 cores
16GB RAM
64bit Windows 8
Run Code Online (Sandbox Code Playgroud)

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

dhg*_*dhg 10

问题是你正在执行的操作是如此之快(只是增加两个整数),这使得并行化的开销不仅仅是好处.如果操作较慢,并行化才真正有意义.

可以这样想:如果你有8个朋友,你给每个人一个整数写在一张纸上并告诉他们加一个,把结果写下来,然后把它还给你,你会在给他们之前记录下来下一个整数,你花了很多时间来回传递消息,你可以完成所有更快的添加.

另外:从不.par在List上执行,因为并行化过程必须将整个列表复制到并行集合中,然后将整个事件复制回来.如果你使用Vector,那么它不需要做额外的工作.

  • 如果在List上调用.par,它会强制复制整个列表,然后才能执行任何操作,然后必须将其复制回来,以便它可以向您返回List.你手动进行转换可能不会让它变得更好,但是如果你使用Vector,那么它就不必复制.我实际上建议不要使用List; 对于基本上所有事情,矢量显然更好. (2认同)