我正在测试一种记忆的递归版本,以便在给定点上找到斐波那契数(我正在使用50)。 Java中的执行时间是瞬时的,而在Scala中,它的执行时间约为65-67秒。这是Scala代码:
def fibonacciDP(array : Array[Long] , counter : Int) : Long = {
if (array(counter) != 0L) array(counter)
if (counter == 1 || counter == 2) 1L
else {
val result = fibonacciDP(array, counter - 1) + fibonacciDP(array, counter - 2)
array(counter) = result
result
}
}
这是Java代码:
private static long fibonacciDP(long[] array, int counter) {
if (!(array[counter] == 0L)) {
return array[counter];
}
if (counter == 1 || counter == 2) return 1L;
final long result = fibonacciDP(array,counter - 1) + fibonacciDP(array, counter - 2);
array[counter] = result;
return result;
}
我在以下测试它们:
Scala:
def main(args: Array[String]): Unit = {
val counter = 50
val array = Array.fill(counter+1){0L}
val startTime = System.currentTimeMillis()
println(startTime)
val result = fibonacciDP(array,counter)
println(result)
val endTime = System.currentTimeMillis()
println(endTime - startTime)
}
Java:
public static void main(String[] args) {
final int counter = 50;
long[] array = new long[50+1];
final long startTime = System.nanoTime();
final long fiboNum = fibonacciDP(array,counter);
final long endTime = System.nanoTime();
System.out.println((endTime - startTime)/1000000);
}
然后,我在Scala函数的前两个条件中的值上添加了return
关键字,执行速度下降到平均4ms(3-5ms范围)。
为什么执行速度会有差异?