scala - 为什么Scala 中的这个函数调用没有被优化掉?

标签 scala optimization benchmarking

我正在使用 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)
  }  
}

并在每次循环迭代期间对带有常量参数的纯函数阶乘进行评估(基于计时结果的结论)。优化器不应该在第一次调用后重用函数调用结果吗?

我正在使用适用于 Eclipse 的 Scala IDE。编译器是否有任何优化标志,可以生成更高效的代码?

最佳答案

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

您需要在此处添加您自己的内存方法。最简单的是在循环外部添加一个 val f300 = Factorial(300)

<小时/>

Here is a question about memoization .

关于scala - 为什么Scala 中的这个函数调用没有被优化掉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19316276/

相关文章:

java - 如何在Gattle Feeder中传递java HashMap

scala - 替换不推荐使用的<:< Manifest type witness in Scala 2. 10

algorithm - 二维最大子数组

linux - Tickless Linux 内核是否会引入基准时序变化?

php - 如何在通过 PHP 函数连接到 FTP 时测量 PHP 中的 FTP 传输速度

scala - Vaadin 8 - 包含字符串内容的文本文件的下载按钮

scala - IntelliJ,Akka和配置文件

laravel - 分页计数(*)查询问题

将字符串映射到短替换的算法

java - 使用 Java 创建快速/可靠的基准?