【发布时间】:2011-09-03 00:32:16
【问题描述】:
所以 Scala 应该和 Java 一样快。我正在重新审视我最初在 Java 中解决的 Scala 中的一些 Project Euler 问题。具体问题 5:“能被 1 到 20 的所有数整除的最小正数是多少?”
这是我的 Java 解决方案,在我的机器上完成需要 0.7 秒:
public class P005_evenly_divisible implements Runnable{
final int t = 20;
public void run() {
int i = 10;
while(!isEvenlyDivisible(i, t)){
i += 2;
}
System.out.println(i);
}
boolean isEvenlyDivisible(int a, int b){
for (int i = 2; i <= b; i++) {
if (a % i != 0)
return false;
}
return true;
}
public static void main(String[] args) {
new P005_evenly_divisible().run();
}
}
这是我对 Scala 的“直接翻译”,耗时 103 秒(长 147 倍!)
object P005_JavaStyle {
val t:Int = 20;
def run {
var i = 10
while(!isEvenlyDivisible(i,t))
i += 2
println(i)
}
def isEvenlyDivisible(a:Int, b:Int):Boolean = {
for (i <- 2 to b)
if (a % i != 0)
return false
return true
}
def main(args : Array[String]) {
run
}
}
最后这是我对函数式编程的尝试,耗时 39 秒(55 倍)
object P005 extends App{
def isDivis(x:Int) = (1 to 20) forall {x % _ == 0}
def find(n:Int):Int = if (isDivis(n)) n else find (n+2)
println (find (2))
}
在 64 位 Windows 7 上使用 Scala 2.9.0.1。如何提高性能?难道我做错了什么?还是 Java 更快?
【问题讨论】:
-
你是用scala shell编译还是解释?
-
有比使用试用除法更好的方法 (Hint)。
-
你没有展示你是如何计时的。您是否尝试过为
run方法计时? -
@hammar - 是的,只是用笔和纸的方式完成了:写下每个从高开始的数字的质因数,然后划掉你已经拥有的更高数字的因数,这样你就完成了与 (5*2*2)*(19)*(3*3)*(17)*(2*2)*()*(7)*(13)*()*(11) = 232792560跨度>
-
+1 这是我几周来在 SO 上看到的最有趣的问题(这也是我在很长一段时间内看到的最佳答案)。
标签: java performance scala for-loop while-loop