【发布时间】:2023-04-01 14:55:01
【问题描述】:
我正在对 Scala 中严格(急切执行评估)和非严格(延迟执行评估)的集合执行多个后续转换之间的性能比较。
def time[R](block: => R): R = {
val t0 = System.nanoTime()
val result = block // call-by-name
val t1 = System.nanoTime()
println("Elapsed time: " + (t1 - t0)/1e9 + "s")
result
}
/* A view on a collection makes all transformations lazy, which makes it
possible to combine multiple transformations into one. */
// The non-lazy (eager) version:
time {
(1 to 1e7.toInt).map(_ + 2).map(x => {
if(x % 2 != 0) -x else x
}).sum
}
// The lazy version using a view:
time {
(1 to 1e7.toInt).view.map(_ + 2).map(x => {
if(x % 2 != 0) -x else x
}).force.sum
}
在我的笔记本电脑上,第一次运行急切版本比懒惰版本慢。请参阅下面的时间安排。
渴望版本:2.4 秒
惰性版本:0.7 秒
但是,从第二次运行开始,它们都需要大约 0.7 秒。为什么?
运行时环境:
- Scala 2.11.7
- Java 1.8
- OS X 10.10
【问题讨论】:
标签: performance scala collections profiling lazy-evaluation