Obliczanie czasu wykonania algorytmu w C

0

Mam za zadanie policzyć czas wykonywania algorytmu.
Uzyłem funkcji z time.h, program do testowania silni odpala, ale nie wiem czemu nie oblicza czasu:

#include "stdafx.h"
#include <time.h>

int _tmain(int argc, _TCHAR* argv[])
{
   int a,s,i,t;
   clock_t start, stop;
   float time;
   printf("Prosze podac liczbe=");
   scanf("%d",&a);

   start=clock();
   if(a>=0)
   {
   s=1;
   for(i=1; i<=a; i++)
   s=i*s;
   stop=clock();
   time=(stop - start)/CLK_TCK;
   printf("Czas wykonania algorytmu:%0.50f\n",time);
   printf("Silnia podanej liczby wynosi:");
   printf("%d\n",s);
   }
   else
      printf("Niewlasciwy argument funkcji\n");
   return 0;
} 
0

eeee, a ile wg ciebie kod miedzy start a stop się wykonuje? Jest tego aż:

s=1;
for(i=1; i<=a; i++)
s=i*s;

przecież to nawet milisekundy nie zajmie.

0

To co mógłbym pozmieniac, jak "utrudnic" algorytm żeby potestować czas jego wykonania

Odpaliłem jeszcze raz i pokazuje jednak na dalszych miejscach jakies wartosci, ale przy silni 12 sa one za kazdym razem inne. Wiec chyba jest cos nie do konca ok z tym kodem.

0

algorytmu nie utrudniaj, tylko go wykonaj np 10 000 razy. Wtedy będziesz miał czas wykonania powiedzmy w sekundach i powiedzmy, że będzie sens to mierzyć. Domyślnie timer pod windowsem na przykład ma rozdzielczość 50ms albo jakoś tak, więc może ci teraz program zwracać 0, 10, albo i 45. tę końcówkę można można psu w d... wsadzić.

#include "stdafx.h"
#include <time.h>

int _tmain(int argc, _TCHAR* argv[]) {
   int a,s,i,t;
   clock_t start, stop;
   float time;
   printf("Prosze podac liczbe=");
   scanf("%d",&a);

   start=clock();   // start pomiaru
   
   for(int rpt=0; rpt<10000; rpt++) {
      // mierzony kod
      if(a>=0) {
         s=1;
         for(i=1; i<=a; i++)
         s=i*s;
         }
      // koniec mierzonego kodu
      }
   stop=clock();
   time=(stop - start)/CLK_TCK;
   printf("Czas wykonania algorytmu xxx razy:%0.50f\n",time);
   printf("Silnia podanej liczby wynosi:");
   printf("%d\n",s);
   }
   else
      printf("Niewlasciwy argument funkcji\n");
   return 0;
} 

btw: przy tak trywialnym kodzie (jedna pętla od 1 do a) to sam czas wykonania pętli "opakowującej" ma wpływ na wykonanie. Żeby to wyeliminować można się pobawić kodem, albo zrobić statystycznie. Tzn, zrobić testy dla a=1,2,3,...,1000
następnie zrobić wykres zależności czasu wykonania od wartości a.
z tego za pomocą regresji liczysz współczynniki prostej, która do tych punktów najlepiej pasuje (metoda najmniejszych kwadratów mi znana akurat jest). I masz ładnie wyliczone, ile wynosi stały narzut wynikający z "opakowania" - narzut wynosi tyle, ile Ci wyjdzie współczynnik b liczonej prostej.

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