gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:07:36 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com