[英]Scala vs F# on List range from 1 to 100000000
我已經在F#和Scala上編寫了一個列表處理函數來比較性能。 要測試該功能,我需要將List初始化為1到100000000。
F#:
let l = [1..100000000];;
Real:00:00:32.954,CPU:00:00:34.593,GC gen0:1030,gen1:520,gen2:9
這有效。
Scala: Scala -J-Xmx2G選項
val l = (1 to 10000000).toList // works
val l = (1 to 100000000).toList // no response long while and finally got java.lang.OutOfMemoryError: Java heap space
使用100000000(100,000,000),長時間(一小時)沒有響應,CPU利用率為75%到90%,內存利用率為2GB,最終得到java.lang.OutOfMemoryError:Java堆空間。
我在Scala做錯了嗎?
請注意, val l = (1 to 100000000).toList
會創建一個包含原始Range
(1 to 100000000)
內容的新List
,因此可能會導致堆空間不足,以及垃圾收集器的嚴重觸發。 @krynio建議增加-J-Xmx
。
但是,如果不修改堆大小,請考慮使用迭代器,尤其是在性能測試依賴於列表上的順序迭代時; 像這樣
(1 to 100000000).iterator
res0: Iterator[Int] = non-empty iterator
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.