我在一台32位的Debian 6.0 (Squeeze)系统上运行(一个2.5GHz的Core 2 CPU),安装了 sun-java6 6.24-1,但使用来自 Wheezy 的 Scala 2.8.1 软件包。
这段代码使用 scalac -optimise
编译后,运行需要超过30秒:
object Performance {
import scala.annotation.tailrec
@tailrec def gcd(x:Int,y:Int):Int = {
if (x == 0)
y
else
gcd(y%x,x)
}
val p = 1009
val q = 3643
val t = (p-1)*(q-1)
val es = (2 until t).filter(gcd(_,t) == 1)
def main(args:Array[String]) {
println(es.length)
}
}
但是,如果我对代码进行微小的更改,将val es=
移动到main
的范围内并向下移动一行,则可以在仅需1秒的时间内运行,这与等效的C ++的性能相当。有趣的是,将val es=
保留在原处,但使用lazy
进行限定也具有同样的加速效果。
这里发生了什么?为什么在函数范围外执行计算会慢得多?