【发布时间】:2014-09-07 20:06:47
【问题描述】:
以下 Scala 代码在 1.5 分钟内完成,而 GO 中的等效代码在 2.5 分钟内完成。
最多 fib(40) 都需要 2 秒。间隙出现在 fib(50)
我的印象是,原生的 GO 应该比 Scala 更快。
斯卡拉
def fib(n:Int):Long = {
n match {
case 0 => 0
case 1 => 1
case _ => fib(n-1) + fib(n-2)
}
}
去
func fib(n int) (ret int) {
if n > 1 {
return fib(n-1) + fib(n-2)
}
return n
}
Scala 优化?
Golang 限制?
正如“我的另一辆车是 cadr”所说,问题是“为什么 Scala 在这个特定的微基准测试中比 GO 更快?”
忘记斐波那契,假设我确实有一个需要递归的函数。
Scala 在递归情况下更胜一筹吗?
它可能是一个内部编译器实现,甚至是 Scala 特定的优化。
知道的请回答。
在 12 秒内循环运行 15000000000
func fib(n int) (two int) {
one := 0
two = 1
for i := 1; i != n; i++ {
one, two = two, (one + two)
}
return
}
【问题讨论】:
-
我没有看到任何优化,它是指数级的,递归斐波那契的例子被用来展示如何不编写递归函数。似乎,效果是由于一些实现的细微差别,可能是垃圾收集,可能是进程可用的内存(例如,由于某种原因,在 scala 中它足以完成任务而在 go - 不是)。我会在高峰期检查内存消耗。
-
由于 Scala 是 JIT 编译的,它可以在几次递归调用后做一些临时记忆。我已经让 JVM 在循环展开方面做了一些非常好的优化。
-
虽然go代码被编译成机器码,但是runtime还是做所有的内存和栈管理,所以和JVM基本一样。我并不奇怪 JVM 比 go 优化得更好。