Scala 2.10.3 でこのプログラムを実行しています。
object Test {
def main(args: Array[String]) {
def factorial(x: BigInt): BigInt =
if (x == 0) 1 else x * factorial(x - 1)
val N = 1000
val t = new Array[Long](N)
var r: BigInt = 0
for (i <- 0 until N) {
val t0 = System.nanoTime()
r = r + factorial(300)
t(i) = System.nanoTime()-t0
}
val ts = t.sortWith((x, y) => x < y)
for (i <- 0 to 10)
print(ts(i) + " ")
println("*** " + ts(N/2) + "\n" + r)
}
}
定数引数を持つ純粋な関数の呼び出しは、factorial
各ループ反復中に評価されます (タイミング結果に基づく結論)。オプティマイザーは、最初の呼び出しの後に関数呼び出しの結果を再利用すべきではありませんか?
私はEclipse用のScala IDEを使用しています。より効率的なコードを生成するコンパイラの最適化フラグはありますか?