我看到了这个旧问题,并用scala 2.10.3进行了以下实验。
我重写了Scala版本,使用明确的尾递归:
我重写了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
这是在(Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_51)上的Scala 2.10.3。
我的问题是,使用这个Scala版本有什么潜在成本?
非常感谢。
isEvenlyDivisible
中三元运算符的完全相等。这对于速度比较来说并不重要,但现在的代码并不完全相等。此外,你是否已经预热了JVM,并在X次运行后提供了平均值? - skiwiwhile
来避免闭包的创建。经验证明,Scala输出之间的时间间隔也更长。 - Phil.class
文件。无论如何,请查看我的答案以获取更新后的结果。 - Phil