【发布时间】:2011-09-10 02:05:14
【问题描述】:
我在 32 位 Debian 6.0 (Squeeze) 系统(2.5 GHz 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 对其进行限定也具有相同的加速效果。
这里发生了什么?为什么在函数范围外执行计算这么慢?
【问题讨论】:
-
我在没有
-optimize, FWIW 的 2.8.1 (Sun Java 1.6.0_24-b07) 中看到了同样的情况。 -
一提到优化就有点牵强,抱歉;我从来没有真正看到使用它(或没有)对我从事的任何 Scala 产品的性能产生任何重大影响。
-
有趣...同样的事情发生在带有和不带 -optimize 的 scala 2.9.0 的类似系统上。
标签: performance optimization scala