Skocz do zawartości
blondynaa

Jak W C++ Obliczyc Czas Wykonania Algorytmu?

Rekomendowane odpowiedzi

Proponuje użyć

DWORD timeGetTime(VOID);

Windows NT/2000/XP: Included in Windows NT 3.1 and later.

  Windows 95/98/Me: Included in Windows 95 and later.

  Header: Declared in Mmsystem.h; include Windows.h.

  Library: Use Winmm.lib.

Przed startem algorytmu pobierasz czas, wykonujesz wszystkie operacje, i znów pobierasz czas.

Potem już tylko trzeba odjąć i masz wynik :)

Funkcja ta zwraca czas w milisekundach.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mozna tez zrobic tak:

 

...#include <time.h>...int main()   {int czas1, czas2;czas1=clock();  // za czas1 zostanie wstawiony czas w milisekundach od momentu wlaczenia programu// tutaj wstawic algorytmczas2=clock();czas2=czas2-czas1;   }

 

nie wiem czy to jest w 100% poprawne bo z glowy pisze, ale wydaje mi sie ze powinno dzialac.

Edytowane przez jg5

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziekuje za pomoc, hmm wszystko jest ok jezeli to co mi wyzej napisaliscie wstawie na poczatku i na koncu programu to wypisze mi czas wykonywania programu, jednak gdy wstawie to do konkretnej procedury to wtedy nie obliczy czasu, czy idzie jakos zrobic zeby obliczyc czas wykonania samej procedury?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziekuje za pomoc, hmm wszystko jest ok jezeli to co mi wyzej napisaliscie wstawie na poczatku i na koncu programu to wypisze mi czas wykonywania programu, jednak gdy wstawie to do konkretnej procedury to wtedy nie obliczy czasu, czy idzie jakos zrobic zeby obliczyc czas wykonania samej procedury?

1686727[/snapback]

Co rozumiesz przez nie obliczy czasu ?

Jeśli jest zero to znaczy że dana procedura wykonywała sie za krótko ( < 1ms)

Jeśli chcesz testować szybkość algorytmu, to wykonaj go w pętli np 1000 razy i wtedy wynik będzie dobry :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mozna tez to zmierzyc za pomoca QueryPerformanceCounter i QueryPerformanceFrequency. Jest znacznie dokladniejszy niz GetTickCount, aczkolwiek wiele zalezy od systemu (np. Win98 ma malo dokladne mozliwosci pomiaru i GetTickCount na tym systemie ma dokladnosc ok 55ms, podczas gdy na XP jest to AFAIR ok 10ms).

Lepiej jednak polaczyc te metody i zarowno uzyc dokladniejszych metod pomiaru, jak i mierzyc kilku(set)krotne wykonanie danego kawalka kodu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mozna tez to zmierzyc za pomoca QueryPerformanceCounter i QueryPerformanceFrequency. Jest znacznie dokladniejszy niz GetTickCount, aczkolwiek wiele zalezy od systemu (np. Win98 ma malo dokladne mozliwosci pomiaru i GetTickCount na tym systemie ma dokladnosc ok 55ms, podczas gdy na XP jest to AFAIR ok 10ms).

Lepiej jednak polaczyc te metody i zarowno uzyc dokladniejszych metod pomiaru, jak i mierzyc kilku(set)krotne wykonanie danego kawalka kodu.

1692185[/snapback]

Na innym forum jakiś czas temu była o tym dyskusja.

W sumie wyszło na to, że GetTickCount ma taką dokładność jak mówisz, a timeGetTime jest do 1ms, i dla zwykłych zastosowań w zupełności wystarczy.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

siemka. odkopuje temat by nowego nie zakladac.

 

Jak zrobic zeby wyswietlal sie czas wykonywania petli? Musi wie wyswietla c w formacie: 0h 00m 00s

 

probowalem uzyc tego co tu wczesniej pisaliscie ale nie daje to takiego wyniku :(

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak masz wynik w sekundach (albo ms, ale to latwo "przeliczyc" na sekundy) to trzeba dokonac odpowiednich przeksztalcen, aby wyciagnac ilosc godzin, minut i sekund. Z grubsza bedzie wygladalo to tak:

 

int h, m, s;s = time % 60; // reszta z dzielenia ilosci sekund przez 60 daje nam "koncowke"m = (time / 60) % 60; // dzielimy przez 60, aby uzyskac ilosc minut, ale interesuje nas tylko reszta z dzielenia przez 60, aby przy czasie >1h nie otrzymac dziwnych wynikowh = time / 3600; // dzielimy przez ilosc sekund w godzinie i mamy ilosc godzin

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

no dobra. to program caly wyglada tak:

#include <cstdlib>#include <iostream>#include <windows.h>main (void){long long double a,b,c,d;	 int t1, t2, h, m, s;	 	 t1=GetTickCount();for (a = 1; a <= 1024; a++)	 {		 b=a;		 c=a * 24 * a;		 d=a * 102400 / 3;		 std::cout << a * b << std::endl;		 std::cout << a * c << std::endl;		 std::cout << a * d << std::endl;		 std::cout << c * d << std::endl;	 }	 std::cout << "Test passed.\n" << std::endl;t2=GetTickCount() - t1;s = t2 % 60; // reszta z dzielenia ilosci sekund przez 60 daje nam "koncowke"m = (t2 / 60) % 60; // dzielimy przez 60, aby uzyskac ilosc minut, ale interesuje nas tylko reszta z dzielenia przez 60, aby przy czasie >1h nie otrzymac dziwnych wynikowh = t2 / 3600; // dzielimy przez ilosc sekund w godzinie i mamy ilosc godzinstd::cout << h << std::endl; std::cout << m << std::endl; std::cout << s << std::endl; 			  	 system("Pause");}
tylko mam problem. bo jak program dziala 1 sek to mi wyswietla:

h 0

m 6

s 31

 

wtf? :?

 

 

EDIT!

 

Juz rozwiazalem problem :)

 

s = t2 / 1000; // reszta z dzielenia ilosci sekund przez 60 daje nam "koncowke"m = (s / 60) % 60; // dzielimy przez 60, aby uzyskac ilosc minut, ale interesuje nas tylko reszta z dzielenia przez 60, aby przy czasie >1h nie otrzymac dziwnych wynikowh = s / 3600; // dzielimy przez ilosc sekund w godzinie i mamy ilosc godzins = (t2 / 1000) - (60 * m); // reszta z dzielenia ilosci sekund przez 60 daje nam "koncowke"std::cout << h << std::endl; std::cout << m << std::endl; std::cout << s << std::endl;
Edytowane przez xacti

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...