[C++] Funkcje mierzące czas działania modułu programu


(Quentin) #1

Witam!

Czy ktoś mógłby pokazać jakiś prosty przykład odnośnie dwóch funkcji mierzących czas działania poszczególnego fragmentu programu:

:arrow: QueryPerformanceCounter

:arrow: QueryPerformanceFrequency

Szukałem na ten temat, ale nigdzie nie mogę znaleźć dobrej strony po polsku gdzie jest podany przykład i wytłumaczone o co chodzi w tym ich argumencie-wskaźniku - (_LARGE_INTEGER*). I czym się one w ogóle różnią ?


(Fiołek) #2

LARGE_INTEGER to zwykły, 64-bitowy int(GCC: int64_, VC: __int64).

Tu masz przykład:

//Pobieramy rozdzielczość.

__int64 freq = 0;

QueryPerformanceFrequency(&freq);


//Pobieramy aktualną ilość ticków.

__int64 counter = 0;

QueryPerformanceCounter(&counter);


double time = static_cast(counter) / static_cast(freq); //Przez to dzielenie otrzymujemy czas w sekundach.

(Quentin) #3

A da się jakoś zrobić z tego czas w jednostce czasu mniejszej niż milisekundy :?: To będą chyba mikrosekundy...

Bo mi zależy na bardzo dużej dokładności. Nie chcę programów wrzucać w pętle, które wykonują się 50,000,00 razy, żeby uzyskać wynik w sekundach. (One są takie krótkie, że muszę tak robić, a co za tym idzie muszę czekać niepotrzebnie aż wykona się taka pętla...)


(Fiołek) #4

Jeśli nie podzielisz counter przez freq otrzymasz najmniejszą jednostkę jaką da się uzyskać - tick. Na tym opierają się najbardziej dokładne profilery.

PS. Nie otrzymujesz czasu tylko w sekundach/milisekundach, ale w każdej jednostce(dlatego tam jest double, a nie int czy inny typ całkowity).