Scala - 聚合与foldLeft的性能比较

时间:2016-11-15 07:34:38

标签: scala aggregate foldleft

我的理解是/:与foldLeft相同,如果使用'par'将列表转换为并行集合,则聚合是foldLeft的更快版本。如果我是正确的,为什么以下代码显示:/和foldLeft比列表中'par'使用的聚合更快。

我正在计算大型列表的元素总数和元素数,并将结果存储在元组[Double,Double]中。

//initial tuple2 (sum,count)

val tsc:Tuple2[Double,Double] = Tuple2(0.0,0.0) 

//create a large list
val largeList = List.tabulate(500000)(n=>n*n)

//note time
val time1 = System.currentTimeMillis

//using aggregate without par
largeList.aggregate(tsc) ((tsc,elem) => (tsc._1+elem, tsc._2+1), (tsc1, tsc2)=>((tsc1._1+tsc2._1), (tsc1._2+tsc2._2)))

//note time
val time2 = System.currentTimeMillis

//use aggregate with par

largeList.par.aggregate(tsc) ((tsc,elem) => (tsc._1+elem, tsc._2+1), (tsc1, tsc2)=>((tsc1._1+tsc2._1), (tsc1._2+tsc2._2)))

//note time
val time3 = System.currentTimeMillis

//use /:
(tsc /: largeList)((tsc,elem)=>(tsc._1+elem, tsc._2+1))

//note time
val time4 = System.currentTimeMillis

//use foldLeft
largeList.foldLeft(tsc)((tsc,elem)=>(tsc._1+elem, tsc._2+1))

//note time
val time5 = System.currentTimeMillis

//calcualte time difference
println ("Time without par (millisecond)"+(time2-time1))

println ("Time with par (millisecond)"+(time3-time2))

println ("Time with /: (millisecond)"+(time4-time3))

println ("Time with FoldLeft (millisecond)"+(time5-time4)

我得到了以下结果

第一次运行的结果

Time without par (millisecond)1198
Time with par (millisecond)1479
Time with /: (millisecond)626
Time with FoldLeft (millisecond)661

第二轮结果

Time without par (millisecond)703
Time with par (millisecond)581
Time with /: (millisecond)435
Time with FoldLeft (millisecond)423

我在使用cmd的Windows 10中运行它。 /:和FoldLeft在性能上看起来相似,并且比聚合要好得多。与par相同的聚合实际上在第一轮运行时更耗时。由于窗口中的“cmd”(控制台)无法利用多线程(这里只是猜测),这可能是个问题吗

1 个答案:

答案 0 :(得分:1)

几个问题。您的数据集非常小(因此并行化和线程管理的开销很大)。使用List表示聚合的合并步骤为O(N) - 一旦增加数据集大小,这似乎是最重要的因素。

切换到Vector并使用10倍大的Vector,我得到:

Time without par (millisecond)271
Time with par (millisecond)297
Time with /: (millisecond)216
Time with FoldLeft (millisecond)274

不那么引人注目。我只是在Scala工作表中进行一次运行,因此在这些数字中看到了很多变化

(我只有一个双核系统,因此与增益相比,并行化的开销很大,似乎)

相关问题