我已经在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
创建一个List
包含原始内容的新内容Range
(1 to 100000000)
,因此可能会导致堆空间不足,以及垃圾收集器的大量触发.-J-Xmx
随着@krynio建议增加.
但是,如果不修改堆大小,请考虑使用迭代器,尤其是在性能测试依赖于列表上的顺序迭代时; 像这样
(1 to 100000000).iterator res0: Iterator[Int] = non-empty iterator