1 / 4
Sep 2017

Witam wszystkich. Jestem nowym użytkownikiem tego forum i jest to mój pierwszy wpis.

Zrobiłem program zliczający czas dwóch funkcji, jedna liczy silnie przez iterację a druga liczy silnie przez rekursję.

Zdarza się, że czas jednej i drugiej funkcji jest taki sam np: 0,000004204043303 i 0,000004204043303, co mnie bardzo dziwi bo to jest niemożliwe żeby dwie różne funkcje zrobił w tym samym czasie. ’

A czasami jest taki, że jedna funkcja trwa 0 a druga 0,48342293832.

Co zrobiłem źle?

  #include <iostream>
#include <cstdlib>
#include <time.h>
#include<iomanip>

using namespace std;

clock_t start, stop, start2, stop2;
float czas, czas2;


int silniai(double n)
{
    start=clock();
    double wynik=1;
    for(int i=1;i<=15;i++)

    {
    wynik=n*wynik;
    n--;
    }

    return wynik;
    stop=clock();
}

int f(double n)
{

    start2=clock();
    if (n==0) return 1;
    else return f(n-1)*n;
    stop2=clock();
}






int main()
{



    cout <<silniai(15)<< endl;

    czas=(double)(stop - start)/CLOCKS_PER_SEC;
    cout <<setprecision(50)<< czas<<endl;





    cout <<f(15)<<endl;

    czas2=(double)(stop2 - start2)/CLOCKS_PER_SEC;
    cout << setprecision(50) << czas2;



return(0);
}

Dzięki, pozdrawiam

  • created

    Sep '17
  • last reply

    Sep '17
  • 3

    replies

  • 488

    views

  • 3

    users

  • 1

    like

a co dobrze ? :slight_smile:

wartości to chyba raczej dostajesz ujemne, bo stop i stop2 nigdy nie będą ustawione a jako globalne będą miały wartość 0

czas wykonania obu tych funkcji jest niemierzalny, gdyż wykonają się w czasie poniżej jednego przerwania zegarowego, co prawda CLOCKS_PER_SEC podawane jest jako 10000000 (milion) ale nie jest to wartość prawdziwa, naprawdę jest znacznie mniejsza i jest mnożona tak aby clock był podawany w mikrosekundach

wartości start i start2 będą miały w związku z tym wartość wynikającą z czasu initializacji programu, tylko w wyjątkowych przypadkach będę się różniły i raczej będzie to wynikało z instrukcji cout niż liczenia silnii

a to, że 15! nie mieści się w zakresie int to już całkowity drobiazg

Najdłużej zmagałem się z właśnie z tym żeby pokazać więcej miejsc po przecinku czasu, bo myślałem, że w tym tkwi problem.

To ile musi trwac funkcja, żeby trwały chociaż jedno przerwanie zegarowe żeby do stop coś sie zapisało??

Dzięki za pomoc to są banalne rzeczy jak juz się wie o co chodzi :smiley:

Są narzędzia pozwalające mierzyć czas działania dwóch różnych funkcji (profilery). Jeżeli chcesz cokolwiek na szybko samemu to wywołaj tę samą funkcję kilka tysięcy razy i drugą podobnie i będziesz miał namacalną różnicę czasową.

for(int i = 0; i < 10000; i++) {
    silniai(15)
}

PS. Wcale nie polecam tego sposobu w ogólności, ale do najprostszych sytuacji zadziała.