[c++] Jak dlugo program dziala w ms.

0

Witam,
chcalbym moc stwierdzic ile czasu mija pomiedzy wywolaniami kilku funkcji z jak najwieksza dokladnoscia.
Probowalem poprzez time() ale to daje dokladnosc co do sekundy, probowalem GetTickCount() ale to tez sie nie sprawidzlo bo roznica pomiedzy kolejnymi wywolaniami tej funkcji to dosyc czesto "0".

Znacie jakis sposob na to?

0

QueryPerformanceCounter

0

możesz użyć z WinAPI QueryPerformanceCounter(_LARGE_INTEGER*)
a było to tutaj: http://4programmers.net/Forum/viewtopic.php?mode=watch&id=92371

0

Wywołaj funkcję 1000 razy i zmierz czas łączny.

A tu masz wzór jak obliczyć czas jednego wywołania:
t = T/n, gdzie:
T - czas łączny dla n wywołań,
n - liczba wywołań,
t - czas na jedno wywołanie.

Jeszcze uzasadnienie teoretyczne:
niech: T = t1 + t2 + ... tn,
twierdzenie graniczne Kołmogorowa pozwala na stwierdzenie, że:
lim (n -> nieskończoności) T/n -> t_śr z prawdopodobieństwem 1,
oczywiście nasze t = t_śr. :-D

0

a jak to zrobic pod linuxem?

I nie mam co testowac 1000-kroc tej funkcji gdyz na dowolnym innym komputerze ten czas wykonywania bedzie inny. W sumie to wystarczy ze, cokolwiek bardziej pamiecio/proceso - zernego uruchomie i bedzie inny wynik :).

0
frea napisał(a)

I nie mam co testowac 1000-kroc tej funkcji gdyz na dowolnym innym komputerze ten czas wykonywania bedzie inny. W sumie to wystarczy ze, cokolwiek bardziej pamiecio/proceso - zernego uruchomie i bedzie inny wynik :).

Fajnie bredzisz - najlepiej to odpal ze trzy filmy, dwie gry 3d, włącz jeszcze formatowanie dysku
i wtedy testuj szybkość tej funkcji.
Później przetestuj to na wyłączonym komputerze, i z uzyskanych czasów oblicz średnią harmoniczną modulo pi.

0

Co do funkcji ?QueryPerformanceCounter()?.
Ile wykonanego kodu pociągnie za sobą wołanie WinAPI? Ile wg polecanej funkcji trwa samo jej wykonanie?

Tak naprawdę to jest jedna, słownie jedna instrukcja Assemblera (Jeżeli mamy Pentium)
W rejestrax EDX:EAX umieszcza 64bitową wartość licznika, zerowanego przez RESET, a inkrementowanego z każdym taktem zegara (zew). Czyli nie pokazuje ona czasu w sekundach.
Np. na moim chudzieńkim łaptopie, licznik ten w ciągu sekundy przyrasta o około 100?000?000, czyli co około 10 nS.

Przykład dla FreePascala,
Typowi "qword" odpowiada w C "long long unsigned int" albo "_LARGE_INTEGER" (64bitowa, całkowita wartość bez znaku).
64 bitowa wartość funkcji zwracana jest w EDX:EAX.
RDTSC to ta instrukcja właśnie.

function rdtsc:qword; assembler; asm
    RDTSC          // DB     00Fh, 031H
end;
0
Xitami napisał(a)

Tak naprawdę to jest jedna, słownie jedna instrukcja Assemblera (Jeżeli mamy Pentium)
W rejestrax EDX:EAX umieszcza 64bitową wartość licznika, zerowanego przez RESET, a inkrementowanego z każdym taktem zegara (zew). Czyli nie pokazuje ona czasu w sekundach.
Np. na moim chudzieńkim łaptopie, licznik ten w ciągu sekundy przyrasta o około 100?000?000, czyli co około 10 nS.

RDTSC jest dobra do pomiaru baaardzo małych fragmentów kodu, ale nie całych procedur (szczególnie odwołujących się do innych fukcji) - wpływ wielowątkowości. QueryPerformanceCounter to jedyne sensowne rozwiązanie (na windowsach), ale jak na ironię, wpływa niekorzystnie na wydajność mierzonych procedur.

0
shimandudek napisał(a)
frea napisał(a)

I nie mam co testowac 1000-kroc tej funkcji gdyz na dowolnym innym komputerze ten czas wykonywania bedzie inny. W sumie to wystarczy ze, cokolwiek bardziej pamiecio/proceso - zernego uruchomie i bedzie inny wynik :).

Fajnie bredzisz - najlepiej to odpal ze trzy filmy, dwie gry 3d, włącz jeszcze formatowanie dysku
i wtedy testuj szybkość tej funkcji.
Później przetestuj to na wyłączonym komputerze, i z uzyskanych czasów oblicz średnią harmoniczną modulo pi.

Eeh? Ja napisalem, ze potrzebuje czegos, co pozwoli mi sprawdzic czas pomiedzy wywolaniami funkcji - a nie czegos co pozwoli mi przetestowac predkosc funkcji :/. Gdybym to chcial to bym po prostu uzywal polecenia "time".

Anyway - dzieki za te odpowiedzi, ale niestety, co oczywiste, sprawdzaja sie tylko pod windowsami. Macie moze jakis pomysl jak to zrobic pod linuxem?

0

A czy ten czas to może być liczony w dniach?

0x666 napisał(a)

RDTSC jest dobra do pomiaru baaardzo małych fragmentów kodu, ale nie całych procedur (szczególnie odwołujących się do innych fukcji) - wpływ wielowątkowości. QueryPerformanceCounter to jedyne sensowne rozwiązanie (na windowsach), ale jak na ironię, wpływa niekorzystnie na wydajność mierzonych procedur.
Microsoft (właśnie zwalniają Gatesa ;-) ) jest bardzo lakoniczny. Nic nie piszą o tym czy licznik
dla QueryPerformanceCounter zatrzymuje się przy przejęciu sterowanie przez OSa.
Jak z tym jest?

0

Nic nie piszą o tym czy licznik
dla QueryPerformanceCounter zatrzymuje się przy przejęciu sterowanie przez OSa.
Jak z tym jest?

Mało prawdopodobne, ale do profilowania kodu wystarczające - wyniki kilku pomiarów są zbliżone czego nie można powiedzieć o RDTSC.

0

A funkcja GetThreadTimes ? Czy nadaje się ona do pomiaru szybkości jakiejś funkcji ?

0

Ciekawe, na temat RDTSC

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