【发布时间】:2013-10-19 10:10:15
【问题描述】:
我正在使用 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。编译器是否有任何优化标志,可以生成更高效的代码?
【问题讨论】:
-
编译器怎么知道它是一个纯函数?
-
如果
BigInt上的*是纯的,那么factorial是纯的。我刚刚花了一天时间阅读 Scala 中的编程,所以我对 Scala 编译器的了解太少了。我的主要观点是,由 LLVM 编译的 C++ 或 D 中的类似代码将重复调用具有优化掉常量参数的函数。 -
@PaulJurczak 顺便说一句,你能提供一些关于 LLVM 优化的文章、论文或其他内容的链接吗?我的意思是由 LLVM 编译的 C++ 或 D 中的类似代码将重复调用具有优化的常量参数的函数
-
@om-nom-nom 这是我在 D lang 论坛上关于此优化的帖子的链接:forum.dlang.org/thread/utwrmmycxfxncflofksf@forum.dlang.org 这不是相同的代码,但情况非常相似。我用 Scala 测试了
e28函数,并且常量调用没有被优化掉。
标签: scala optimization benchmarking