2016-11-15 56 views
0

我的理解是/:與foldLeft相同,並且聚合是foldLeft的更快版本,如果列表使用「par」轉換爲並行集合。如果我是正確的,爲什麼下面的代碼顯示:/和foldLeft比列表上使用'par'的集合更快。Scala - 聚合與性能的比較leftLeft

我正在計算一個大列表的元素總數和元素數量,並將結果存儲在一個元組[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

幾個問題。您的數據集非常小(因此並行化和線程管理的開銷很大)。使用List意味着您的聚合的合併步驟是O(N) - 這似乎是增加數據集大小後最重要的因素。

切換到Vector和使用Vector 10倍,我得到:

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

是那麼戲劇性。我只是在Scala工作表中做了一次運行,所以看到這些數字有很大的變化

(我只有一個雙核系統,所以並行的開銷比增益大,看起來好像)