Я столкнулся с этим старым вопросом и сделал следующий эксперимент с scala 2.10.3.
Я переписал версию scala, чтобы использовать явную рекурсию хвоста:
import scala.annotation.tailrec
object ScalaMain {
private val t = 20
private def run() {
var i = 10
while(!isEvenlyDivisible(2, i, t))
i += 2
println(i)
}
@tailrec private def isEvenlyDivisible(i: Int, a: Int, b: Int): Boolean = {
if (i > b) true
else (a % i == 0) && isEvenlyDivisible(i+1, a, b)
}
def main(args: Array[String]) {
val t1 = System.currentTimeMillis()
var i = 0
while (i < 20) {
run()
i += 1
}
val t2 = System.currentTimeMillis()
println("time: " + (t2 - t1))
}
}
и сравнил его со следующей версией Java. Я сознательно сделал функции нестатические для справедливого сравнения с Scala:
public class JavaMain {
private final int t = 20;
private void run() {
int i = 10;
while (!isEvenlyDivisible(2, i, t))
i += 2;
System.out.println(i);
}
private boolean isEvenlyDivisible(int i, int a, int b) {
if (i > b) return true;
else return (a % i == 0) && isEvenlyDivisible(i+1, a, b);
}
public static void main(String[] args) {
JavaMain o = new JavaMain();
long t1 = System.currentTimeMillis();
for (int i = 0; i < 20; ++i)
o.run();
long t2 = System.currentTimeMillis();
System.out.println("time: " + (t2 - t1));
}
}
Вот результаты на моем компьютере:
> java JavaMain
....
time: 9651
> scala ScalaMain
....
time: 20592
Это scala 2.10.3 на (64-разрядная виртуальная машина Java HotSpot TM), Java 1.7.0_51).
Мой вопрос: какова скрытая стоимость с версией scala?
Большое спасибо.