• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czas wykonania funkcji

VPS Starter Arubacloud
0 głosów
554 wizyt
pytanie zadane 1 lipca 2016 w C i C++ przez niezalogowany

Mam problem z kolejnym kodem z zadania domowego z 13 odcinka, za każdym razem czas wykonania funkcji jest równy zero, nawet kiedy wpiszę, że chce pokazać jakiś większy element ciągu, za każdym razem to samo 0s.

#include <iostream>
#include <ctime>

using namespace std;

unsigned long long fib_optimized(int n, unsigned long long n1 = 1, unsigned long long n2 = 1)
{
    return (n == 2)? n2 : fib_optimized(n - 1, n2, n1+n2);
}

unsigned long long iterujemy(int dlugosc)
{

    unsigned long long x=1, y=1;
    while(--dlugosc) x = (y += x) - x;
    return x;

}
int main()
{
    long int element;
    cout << "Podaj ile ktory element ciagu chcesz wyseitlic: ";
    cin >> element;
    double start,stop;
    cout.precision(10);
    unsigned long long wynik;
    start = clock();
    wynik = iterujemy(element);
    stop = clock();
    cout << "Czas wykonania iteracji to " << (stop-start)/CLOCKS_PER_SEC << " s\n";
    start = clock();
    wynik = fib_optimized(element);
    stop = clock();
    cout << "Czas wykonania rekurencji to " << (stop-start)/CLOCKS_PER_SEC << " s\n";

    return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 1 lipca 2016 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
wybrane 1 lipca 2016
 
Najlepsza
Czas wykonania jest relatywnie mały, dlatego zaokrągla do 0ms.

 

Kiedy ja testowałem(kiedyś, kiedyś dawno temu), która wersja jest szybsza, po prostu tworzyłem pętle for i każdą funkcję wywoływałem dla niezbyt dużych danych wejściowych kilkaset razy (gwarancja, że rekurencja nie przepełni stosu, co dzieje się w przypadku bardzo dużej liczby). "Przewaga" jednej funkcji narasta po kilkuset wywołaniach. W ten sposób możesz sprawdzić, która funkcja jest szybsza bez narażania się na wywalenie programu z powodu przekroczenia limitu pamięci. Ponadto nie zobaczysz liczby zero, tylko jakiś "normalny" ułamek dziesiętny.
0 głosów
odpowiedź 1 lipca 2016 przez Michał Muzyka Pasjonat (24,080 p.)
Wydaje mi się ze po prostu twój komputer jest tak szybki że wykonuje to bardzo szybko, przy dużych liczbach w iteracji wyswietla mi 0.01 a rekurencja wywala program.
1
komentarz 1 lipca 2016 przez Patrycjerz Mędrzec (192,320 p.)
Wywala pewnie dlatego, że został przepełniony stos.

Z kolei autor kodu wprowadził złe typy argumentów do funkcji, bo wszystkie powinny być dość duże, aby można było to jako tako testować.
komentarz 1 lipca 2016 przez niezalogowany
edycja 1 lipca 2016

Poprawiłem teraz mój kod, jest teraz dobrze czy zrobiłem może kolejny głupi błąd?

 

#include <iostream>
#include <ctime>

using namespace std;

long double fib(long double n, long double n1 = 1, long double n2 = 1)
{
    return (n == 2)? n2 : fib(n - 1, n2, n1+n2);
}

long double iterujemy(long double dlugosc)
{

    long double x=1, y=1;
    while(--dlugosc) x = (y += x) - x;
    return x;

}
int main()
{
    long double element;
    cout << "Podaj ile ktory element ciagu chcesz wyswietlic: ";
    cin >> element;
    clock_t start,stop;
    cout.precision(20);
    long double wynik;
    start = clock();
    wynik = iterujemy(element);
    stop = clock();
    cout << "Czas wykonania iteracji to " << (double)(stop-start)/(double)(CLOCKS_PER_SEC) << " s\n";
    cin.sync();
    cin.clear();
    start = clock();
    wynik = fib(element);
    stop = clock();
    cout << "Czas wykonania rekurencji to " << (double)(stop-start)/(double)(CLOCKS_PER_SEC) << " s\n";

    return 0;
}

 

0 głosów
odpowiedź 1 lipca 2016 przez Corazzo Obywatel (1,040 p.)
24 linijka, stworzyłeś zmienne start i stop typu double, a powinny być typu clock_t
komentarz 1 lipca 2016 przez niezalogowany
Zobaczyłem taki sposób deklarowania zmiennych liczących czas w tym temacie: http://forum.pasja-informatyki.pl/20846/rekurencja-a-iteracja-d Przetestowałem u siebie ten kod i liczyło normalnie czas. Ma to jakieś znaczenie skoro i tak będę musiał rzutować wynik na inny typ?
komentarz 1 lipca 2016 przez Patrycjerz Mędrzec (192,320 p.)

Lepiej jednak używać clock_t, bo typ, na jaki pokazuje ten alias, jest zależny od implementacji, więc uchroni cię to przed utratą danych przy np. rzutowaniu.

Podobne pytania

0 głosów
1 odpowiedź 418 wizyt
pytanie zadane 10 października 2021 w C i C++ przez yato_ Początkujący (350 p.)
0 głosów
1 odpowiedź 752 wizyt
pytanie zadane 5 listopada 2015 w C i C++ przez Wilier Bywalec (2,570 p.)
0 głosów
1 odpowiedź 459 wizyt
pytanie zadane 25 listopada 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)

93,008 zapytań

141,975 odpowiedzi

321,256 komentarzy

62,350 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...