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,那么它不需要做额外的工作.