Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Obliczenie czasu wykonywania programu

Ostatnio zmodyfikowano 2014-02-28 18:33
Autor Wiadomość
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?
C/C++
#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;
}
P-105395
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.
P-105398
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.

C/C++
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:
C/C++
czas = clock(); //tutaj zaczynamy pomiar
cout << rekurencja( numer ) << endl;
czas = clock() - czas;
cout << "czas wykonania programu rekurencyjnego wynosi: " << czas;

//czas2=clock(); //drugi pomiar na razie wycofujemy
//cout<<iteracja(numer);
//czas2=clock()-czas2;
//cout<<"\nczas wykonania programu iteracyjnego wynosi: "<<czas2;

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.
P-105403
michal11
odp
» 2014-02-28 16:10:43
Ja korzystałem kiedyś z tego:

C/C++
time_t pocz, koniec;

pocz = clock();
//funkcja
koniec = clock();

cout << "W czasie : " << static_cast < double >( koniec - pocz ) / CLOCKS_PER_SEC << " sek";
P-105409
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ć.
P-105420
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.
P-105424
« 1 »
  Strona 1 z 1