Pomiar czasu działania procedury

0

Witam,
Potrzebuje zmierzyć czas działania procedury w C++. Mógłbym to zrobić po prostu używając zegara systemowego (clock()) i zmierzyć różnice tyknięć.
Ale to nie będzie rzeczywisty czas działania procedury - część czasu schodzi na przełączenia kontekstu itp. Mógłbym zrobić liczniki np. w pętlach i sprawdzić ile razy weszło do pętli ale ten sposób też mi się nie podoba.
Czy istnieje jakaś metod, którą mógłbym zmierzyć rzeczywisty czas działania procedury (np. ile instrukcji maszynowych się wykonało, ale niekoniecznie aż tak dokładnie)?

0

Czyli potrzebujesz profilera?

0

w ogolnosci, masz 2 sposoby:

  • albo zapewnic w 100% aby procesor naprawde nic innego nie wykonywal na boku w trakcie dzialania Twojej procedury i wtedy mierzyc czas jakkolwiek Ci wygodnie
  • albo zrobic co tylko mozesz aby odciazyc procesor (powylaczac procesy/uslugi, pozmieniac priorytety, etc), 'zapetlic' wykonanie tejże procedury razy np. milion, zmierzyc czas laczny, podzielic i uznac wynik to przyblizony czas wykonania ------ z zalozeniem ze Twoj kod NIE sa cache'uje wynikow, jesli tak, to to pewnie bedziesz musial wylaczyc

O ile pierwsze jest oczywiste, ale heh, trudne do zrobienia (ale: mozliwe), o tyle drugie - zaklada ze przy DUZEJ ilosci testow, oraz rzadkich i niewielkich zaburzen czasow - albo nie beda wplywac na koncowy sredni wynik, albo beda bardzo male i nieznaczace.

Jezeli mierzysz czasy BARDZO BARDZO male za pomoca clocks i sam fakt przelaczenia kontekstu (itp) niszczy Ci go kompletnie gdyz czas przelaczenia >> czas Twojej metody, to przed tym mozesz zabezpieczyc sie stosunkowo latwo -- oszacuj ile tickow powinna ona zajmowac, oszacuj ile zajmuje jedno zaburzenie, i odrzucaj czasy tych iteracji ktore beda o wiele za duze niz spodziewane -- wtedy usrednisz wyniki tylko po tej czesci, ktora byla 'czysta', bez czasochlonnych przelaczen. Z pomoca tego 'filtru' mozesz spokojnie uzywac clocks

Przypadek 'usredniajacy' mozesz wbudowac w Twoj program zamiast zapetlac procedure - dwie "globalne" zmienne: ilosc odpalen, laczna ilosc tickow - i Twoja procka niech przy kazdym wywolaniu sprawdza swoj czas, podbija licznik odpalen i wsumowuje czas na laczna ilosc tickow. W dowolnej chwili tylko je odcztac i podzielic przez siebie.
Plusy: wynik czasu pobrany w jeszcze bardziej "naturalnych" warunkach pracy
Minusy: obowiazkowy 2x clocks() (+ew 2xInterlockedAdd) moze SPOWOLNIC ta metode z punktu widzenia reszty programu, przez co program moze zaczac chodzic kilkukrotnie wolniej jesli to byla metoda wywolywana 10^n razy. z tego tez powodu ten sposob jest stosowalny tylko do mierzenia LIŚCI. umieszczenie mierzenia czasu online w metodzie A, wywolywanie tej metody w metodzie B i probowanie podobnego mierzenia czasu w metodzie B - powoduje, ze czas metody B bedzie zaburzony o (N wywolan A() z B() * (2xclocks+...)) no ale to oczywiste..

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