3

我正在使用 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。编译器是否有任何优化标志,可以产生更高效的代码?

4

1 回答 1

6

Scala 不是一种纯粹的函数式语言,因此如果没有效果系统,它就无法知道它factorial是纯粹的(例如,它不“知道”任何关于大整数乘法的事情)。

您需要在此处添加自己的记忆方法。最简单地val f300 = factorial(300)在你的循环之外添加一个。


这是一个关于记忆的问题

于 2013-10-11T10:59:57.133 回答