Obliczenie czasu wykonywania programu
Ostatnio zmodyfikowano 2014-02-28 18:33
mateuszq Temat założony przez niniejszego użytkownika |
Obliczenie czasu wykonywania programu » 2014-02-28 13:14:43 Witam, Napisalem program obliczajacy dany element ciagu fibonacciego na dwa sposoby rekurencyjnie i iteracyjnie. Chce obliczyc roznice czasu wykonywania sie poszczegolnych funkcji programu (rekurencja i iteracja) i tu pojawia sie problem. Jezeli obliczam czas jednej z funkcji wsystko przebiega okej, jeśli jednak obliczam czas najpierw pierwszej a potem drugiej program sie sypie. Gdzie może byc błąd? #include<iostream> #include<conio.h> #include<ctime>
using namespace std;
unsigned long long rekurencja( unsigned long long ); unsigned long long iteracja( int );
unsigned long long rekurencja( unsigned long long a ) { if( a < 2 ) return a; else return rekurencja( a - 1 ) + rekurencja( a - 2 ); }
unsigned long long iteracja( int a ) { unsigned long long b = 1, c = 1, d = 1; if( a < 3 ) return 1; else { for( int i = 3; i <= a; i++ ) { if( i % 2 ) { b = d; } else { c = d; } d = b + c; } return d; } }
int main() { int numer = 0, start = 0, stop = 0; cout << "Ciag fibonacciego." << endl; cout << "Podaj numer elementu: "; cin >> numer; start = clock(); cout << rekurencja( numer ) << endl; stop = clock(); cout << "czas wykonania programu rekurencyjnego wynosi: " << stop - start; start = clock(); cout << iteracja( numer ); stop = clock(); cout << "\nczas wykonania programu iteracyjnego wynosi: " << stop - start; _getch(); return 0; }
|
|
michal11 |
odp » 2014-02-28 13:56:54 Co dokładnie się sypie ? Błędy kompilacji, wykonania ? Problem może być w tym, że funkcja clock() nie zwraca inta. |
|
mateuszq Temat założony przez niniejszego użytkownika |
» 2014-02-28 15:32:39 Fakt funkcja clock() nie zwraca inta wiec troche przerobilem program ale efekt niestety ten sam. clock_t czas, czas2; int numer = 0;
cout << "Ciag fibonacciego." << endl; cout << "Podaj indeks elementu: "; cin >> numer; czas = clock(); cout << rekurencja( numer ) << endl; czas = clock() - czas; cout << "czas wykonania programu rekurencyjnego wynosi: " << czas; czas2 = clock(); cout << iteracja( numer ); czas2 = clock() - czas2; cout << "\nczas wykonania programu iteracyjnego wynosi: " << czas2;
Jeżeli wykonamy pomiar czasu tylko tej pierwszej funkcji czyli: czas = clock(); cout << rekurencja( numer ) << endl; czas = clock() - czas; cout << "czas wykonania programu rekurencyjnego wynosi: " << czas;
I teraz tak, jesli wykonam ten pomiar w programie dla tylko tej jednej funkcji "rekurencja" wszystko jest ok (dla n=35 wychodzi cos koło 676 jakis jednostek), natomiast gdy próbuje wykonac pomiar dla obydwu funkcji po kolei, (dla tego samego n=35 pomiar wynosi dla pierwszej funkcji 6739227465 jednostek a dla drugiej ZERO). To samo jest jesli zamienie pomiar czyli w komentarz wezme pierwsza a dla drugiej "iteracja" wykonam pomiar wtedy jest wszystko okej, dla obydwu kicha. |
|
michal11 |
odp » 2014-02-28 16:10:43 Ja korzystałem kiedyś z tego: time_t pocz, koniec;
pocz = clock();
koniec = clock();
cout << "W czasie : " << static_cast < double >( koniec - pocz ) / CLOCKS_PER_SEC << " sek";
|
|
Monika90 |
» 2014-02-28 18:04:49 Nie drukujesz spacji ani przejścia do nowej linii po wydrukowaniu wyniku pomiaru czasu pierwszej funkcji, więc wartość drugiej jest przyklejona do czasu pierwszej. Ta liczba 6739227465 to jest czas 673 i 9227465 czyli wynik obliczenia dla wartości n=35.
Natomiast czas wykonywania drugiej funkcji jest równy zero, bo działa ona tak szybko, że clock() ma za małą rozdzielczość by to zmierzyć. |
|
mateuszq Temat założony przez niniejszego użytkownika |
» 2014-02-28 18:33:49 Monika90 dzięki ! hehe taki głupi błąd aż wstyd :D moja nieuwaga. michał11, wyprobuje twój sposób. |
|
« 1 » |