C++ szybkość działania funkcji.

0

Witam,
Naszło mnie ostatnio coś na zabawę w próby sprawdzania, który kod wykona się szybiej.
Dla przykładu stworzyłem dwie funkcje, które obliczają daną potęge:

 
int potega(int x, int n){
   int wynik = 1;

   for(int i = 1; i <= n; i++){
       wynik = wynik * x;
   }

   return wynik;
}

int potega2(int x, int n, int wynik, int licznik){
    if(licznik == n){
        return wynik;
    }
    else{
        wynik = wynik * x;
        licznik++;
        return potega2(x, n, wynik, licznik);
    }
}

Moje pytanie dotyczy szybkości działania tych kodów. Który z teoretycznego punktu widzenia wykona się szybciej(wiem, że w dzisiejszych czasach taka błahostka nie ma znaczenia)?
Wydaje mi się, że funkcja druga wykorzystuje więcej pamięci RAM, ale jaki będzie rzeczywisty czas wykonania danej fukcji dla tych samych wartości? Nie chodzi mi o dokładne wartości, tylko o to, która zrobi to szybciej, a która wolniej.
Pozdraiwam!

1

Tu nie ma co teoretyzować, bo bardzo wiele zależy od tego, jakich optymalizacji użyje kompilator. Użyj jakiegoś profilera (np. gprofa → http://www.math.utah.edu/docs/info/gprof_toc.html ) i sprawdź sam.

0

Teoretycznie rzecz biorąc to funkcje wywoływane rekurencyjnie są wolniejsze bo masz narzut na kolejne wywołania funkcji, praktycznie wszystko zależy od tego jak kod napiszesz, jednak chyba w przypadku kodu jeden do jednego wyjdzie że iteracja będzie troszkę wolniejsza. Sprawdzając na tym przykładzie wyszły niewielkie różnice czasu na korzyść funkcji potega. http://en.cppreference.com/w/cpp/chrono - tym możesz mierzyć czas wykonywania algorytmu.

0

Tak jak wspomniał Althorion, to zależy m.in. od kompilatora, ale także od maszyny na jakiej to uruchamiasz. Jeśli chciałbyś poeksperymentować i sprawdzić, jak szybko to zadziała u Ciebie, możesz użyć np. std::chrono::high_resolution_clock. Pamiętaj tylko, że wykonanie tej funkcji dla małych wartości może zająć naprawdę krótko, więc warto byłoby, gdybyś wykonał taki test wielokrotnie dla jednego pomiaru. W przypadku potęgowania tak jak tutaj, zwróć też uwagę, że dość szybko wynik przestanie mieścić się w int.

0

Dziękuje za pomoc!
Już sobie poradziłem stosując: time ./"executable_file" w terminalu pod Ubunut.
Okazało się tak jak ktoś z Was mówił, funkcja z for wykona się szybciej. Różnica to mały ułamek sekundy, ale jednak.
Należy dodać, że funkcja referencyjna jest słabo napisana, dlatego nie zalecam brania z niej przykładu.
Dla jasności zamieszczę poprawioną wersję:

 
long double power(long double x, unsigned int n) {
    if (n == 1 ) return x;
    return x * power(x, n - 1);
}

Brat mi wszystko wyjaśnił i pokazał.
Dziękuję jeszcze raz za pomoc i Pozdraiwam!

0

Z tej funkcji iteracyjnej też nie brałbym przykładu, bo można bez większego wysiłku napisać rozwiązanie O(log n). Wystarczy znać podstawowe własności działań na potęgach.

0

Zawsze można zrobić coś lepiej ;).

0

Jak chcesz zrobić coś co wykracza poza zakres klas szk. podst. 1-4 to zaimplementuj tę wersję:

https://en.wikipedia.org/wiki/Exponentiation_by_squaring

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