在jvm-prevent-tail-call-optimization之后两年,似乎有一个原型 实现,MLVM已经将该功能列为"proto 80%"一段时间了.
Sun的/ Oracle方面是否没有积极的兴趣支持尾调用,或者只是尾部调用" 在每个功能优先级列表中排在第二位 [...]"如JVM所述语言峰会?
如果有人测试了MLVM构建并且可以分享它的工作原理(如果有的话),我会非常感兴趣.
更新: 请注意,像Avian这样的某些虚拟机支持正确的尾部调用,没有任何问题.
java language-agnostic optimization jvm tail-call-optimization
获得因子(循环与递归)的这两种方法中的哪一种更有效/更快?如果那个可以改进,怎么样?
语言:Java
private static long factrecur(int n) {
if (n == 0) {
return 1;
}
else {
return n * factrecur(n-1);
}
}
private static long factloop(int a) {
long total = 1;
for (int b=a;b>=1;b--) {
total *= b;
}
return total;
}
Run Code Online (Sandbox Code Playgroud) 我在向朋友解释我期望Scala中的非尾递归函数比尾递归函数慢,所以我决定验证它.我用两种方式编写了一个很好的旧因子函数,并试图比较结果.这是代码:
def main(args: Array[String]): Unit = {
val N = 2000 // not too much or else stackoverflows
var spent1: Long = 0
var spent2: Long = 0
for ( i <- 1 to 100 ) { // repeat to average the results
val t0 = System.nanoTime
factorial(N)
val t1 = System.nanoTime
tailRecFact(N)
val t2 = System.nanoTime
spent1 += t1 - t0
spent2 += t2 - t1
}
println(spent1/1000000f) // get milliseconds
println(spent2/1000000f)
}
@tailrec
def tailRecFact(n: BigInt, s: BigInt …Run Code Online (Sandbox Code Playgroud)