Как оптимизировать выражения for и циклы в Scala?

Итак, Scala должен быть таким же быстрым, как Java. Я возвращаюсь к некоторым проблемам Project Euler в Scala, которые я изначально решал в Java. В частности, проблема 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))
}

Использование Scala 2.9.0.1 в 64-битной Windows 7 . Как мне улучшить производительность? Я делаю что-то неправильно? Или Java просто намного быстрее?

131
задан Peter Mortensen 28 May 2013 в 18:27
поделиться