Funkcja GetCurrentTime


(Ewageo) #1

Mam za zadanie policzyć czas wykonywania algorytmu. Powiedziano nam by uzyc funkcji GetCurrentTime zdefinowanej w nagłówku windows. Nie moge znaleźć na google jak ją zainicjować, jaki ma argumenty. Pewnie będzie ją trzeba wyzerować. Np. kod:

...

zerowanie czasu systemowego

{

tresc algorytmu

}

a=GetCurrentTime;

wypisz a

Prosze o pomoc co wpisać przed i po klamrach. Może a powinno byc tablicą?

Złączono Posta : 30.11.2007 (Pią) 21:19

Program ma byc napisany w C.


(Ryan) #2

Zainicjalizować funkcję? Wyzerować? Kompletnie nie masz pojęcia co masz zrobić, prawda? To program na zaliczenie?


(Ewageo) #3

Jak nie znam argumentów funkcji, bo nie moge jej znaleźć to trudno żebym wiedział dokładnie co z nią zrobić, do czego ją przypisać itp. To nie program na zaliczenie, tylko gostek nam kazał potestować czas wykonywania różnych algorytmów. Jak sie on przzedstawia dla silni przy różnych jej argumentach.


(Ryan) #4

Testowania prędkości w ten sposób nie zrobisz dobrze. Ale mniejsza o to. Przypuszczam, że chodziło mu o timeGetTime a nie GetCurrentTime. Ta funkcja ma najwyższą rozdzielczość wyniku (zaraz po rdtsc, które się do testowania używa).

http://msdn2.microsoft.com/en-us/library/ms713418.aspx

wymaga winmm.lib i mmsystem.h


(GL1zdA) #5

Możesz zawsze odpalić algorytm wielokrotnie, tak by zajmował wiele czasu. Wtedy użyj funkcji z time.h - implementacja będzie dzięki temu przenośna, a jednocześnie nie będzie wymagać precyzji by dawać wartościowe wyniki.


(Awes) #6

Jezeli juz mowa o time.h, to mozna uzyc funkcji clock(), ktora zwraca ilosc czasu faktycznie zuzytego przez proces.


(Ewageo) #7

Uzyłem funkcji z time.h, program do testowania silni odpala, ale nie wiem czemu nie oblicza czasu:

#include "stdafx.h"

#include 


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;

}

(Awes) #8
time=(stop - start)/(double)CLK_TCK;

(Ewageo) #9

Wyswietla nadal tylko 0,0000000000000


(Ryan) #10

Przecież pisałem, że timeGetTime ma najwyższą rozdzielczość w systemie. clock() nie jest w stanie zmierzyć tak niewielkich odstępów czasu. Rozdzielczość clock to kilkadziesiąt - kilkaset milisekund. timeGetTime() pozwala na uzyskanie dokładności niemalże co do milisekundy. Problem w tym, że Twój kod wykona się jeszcze szybciej. 1GHz procesor wykonuje 1 miliard operacji na sekundę. Mnożenie to około 4 cykli zegarowych. Przy wartości zmiennej a rzędu ćwierć miliona pętla wykona się w nieco ponad 1 milisekundę. Jeśli masz szybszy procesor musisz to dodatkowo przemnożyć. Jeśli chcesz zmierzyć czas wykonywania czegoś tak trywialnego, powinieneś to wykonać kilkadziesiąt tysięcy razy i zmierzyć czas od pierwszego do ostatniego wykonania.

Albo jak Bozia przykazała użyj RDTSC.


(Ewageo) #11

No ok ale może dasz mi chociaz linijke kodu - do jakiego typu zmiennej przypisać ta funkcję RDTSC przed i po pętli i w jakim nagłówku jest ona zdefiniowana?


(Fiołek) #12

A poszukać to nie łaska? http://en.wikipedia.org/wiki/RDTSC

Umieszczasz w zmiennych typu unsigned __int64(albo unsigned long long).


(Ewageo) #13

A w jakim nagłówku jest ona zdefiniowana, bo jak dodaje #include to mi tej biblioteki w vs nie znajduje.


(Fiołek) #14

Ta funkcja nie jest domyślnie zdefiniowana, gdyż to asembler. Musisz ją sam zdefiniować.


(Ryan) #15

Zerknij na "Examples of using it"

Masz tam czarno na białym jak w C użyć RDTSC. To pierwszy wynik w Google po wpisaniu RDTSC.