Niezrozumiały(dla mnie) czas wykonania

0

Co pewien czas pojawia się prośba o wyznaczenie liczb pierwszych z podanego zakresu z użyciem funkcji. Wydawało mi się, że użycie funkcji (odkładanie argumentów na stos,..) powinno wydłużyć działanie programu. Postanowiłem sprawdzić o ile. Zacząłem od Javy (program zgodnie z klasyfikacja Krolika jest bardzo lamerski).

//bez użycia funkcji (liczba max jest parametem wywołania)
        double gr=0.0d;
        for(int n=1;n<=max;n++)
        {
            if(n%2!=0)
                gr=Math.sqrt(n);
                for (int i=3;i<=gr;i+=2)
                    if ((n%i)==0)
                        break;
        }
//z użyciem funkcji
        for(int n=1;n<=max;n++)
            isPrime2(n);

    static private boolean isPrime2(int n)
    {
        int i;
        if (n<2)
            return false;
        else
            if ((n%2)==0 && (n!=2))
                return false;
        double gr=Math.sqrt(n);
        for (i=3;i<=gr;i+=2)
            if ((n%i)==0)
                return false;
        return true;
    }

Ku mojemu zdziwieniu kod z użyciem funkcji jest szybszy. Stosunek czasów wykonania zmierza do 2 (przy wzroście max).
Sprawdziłem również w C++ i Pythonie. Efekt jest taki sam.

0

W pierwszym przypadku trzeba "rozwinąć" pętle co powoduje, że kompilator nie za bardzo poradzi sobie z optymalizacją. W drugim przypadku można całość ładnie zoptymalizować, a dodatkowo w Javie masz JIT, które dodatkowo skompiluje metodę do kodu natywnego :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1