我運行該程序使用Scala 2.10.3:爲什麼Scala中的這個函數調用沒有被優化掉?
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。是否有編譯器的優化標誌,這可能會產生更有效的代碼?
編譯器如何知道它是一個純函數? – pedrofurla
如果'BigInt'上的'*'是純的,'factorial'是純的。我花了一天的時間閱讀Scala編程,所以我的知識在Scala編譯器的主題上太過薄弱。我的主要觀點是,LLVM編譯的類似C++或D代碼將重複調用具有常量參數優化的函數。 –
@PaulJurczak順便說一句,你能提供一些關於LLVM中的優化的文章,論文或者一些鏈接嗎?我的意思是*由LLVM編譯的C++或D中的類似代碼將重複調用具有常量參數優化的函數* –