我正在使用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
(基于时序结果的结论)。第一次调用后,优化器不应该重用函数调用结果吗?
我正在使用Scala IDE for Eclipse。是否有编译器的优化标志,这可能会产生更有效的代码?
答案 0 :(得分:6)
Scala不是纯粹的函数式语言,因此如果没有效果系统,它就无法知道factorial
是纯粹的(例如,它不会“知道”关于大整数乘法的任何内容)。
您需要在此处添加自己的记忆方法。大多数情况下只需在循环外添加val f300 = factorial(300)
。