下面的斯卡拉代碼在1.5分鐘內完成,而GO中的等效代碼在2.5分鐘內完成。
直到fib(40)都需要2秒。該差距出現在fib(50)
我得到的印象是,原生GO應該比Scala更快。遞歸GO和斯卡拉
斯卡拉
def fib(n:Int):Long = {
n match {
case 0 => 0
case 1 => 1
case _ => fib(n-1) + fib(n-2)
}
}
GO
func fib(n int) (ret int) {
if n > 1 {
return fib(n-1) + fib(n-2)
}
return n
}
斯卡拉優化?
Golang限制?作爲「我的另一輛車是一個幹部」,問題是「在這個特定的微基準測試中,Scala比GO更快嗎?」
忘記斐波那契讓我說我有一個功能,需要遞歸。
斯卡拉在遞歸情況下更勝一籌嗎?
它可能是一個內部編譯器實現,甚至是Scala特定的優化。
如果您知道,請回答。
轉到在循環運行150億在12秒
func fib(n int) (two int) {
one := 0
two = 1
for i := 1; i != n; i++ {
one, two = two, (one + two)
}
return
}
我沒有看到任何優化,它是指數,遞歸斐波那契的相同例子已被用來顯示如何**不**寫入遞歸函數。看起來,效果是因爲一些實現的細微差別,可能是垃圾回收,也許是內存可用於進程(比如,出於某種原因,在scala中它足夠執行任務,而不是執行)。我會在高峯時檢查記憶力消耗。 – dmitry
由於Scala是JIT編譯的,它可以在幾次遞歸調用之後做一些特殊的記憶。我已經讓JVM在循環展開方面做了一些令人難以置信的優化。 – LinearZoetrope
儘管go代碼被編譯爲機器代碼,但運行時仍然執行所有內存和堆棧管理,因此它與JVM基本相同。我並不驚訝JVM比去更好地優化。 – chendesheng