W systemie Windows clock()
zwraca czas w milisekundach, ale na tym Linuksie, nad którym pracuję, zaokrągla go do najbliższego 1000, więc precyzja jest tylko do poziomu „drugiego”, a nie do poziomu milisekund.
Znalazłem rozwiązanie, w którym Qt używa QTime
klasy, tworząc instancję obiektu i wywołując start()
go, a następnie wywołując, elapsed()
aby uzyskać liczbę milisekund, które upłynęły.
Miałem szczęście, ponieważ na początku pracuję z Qt, ale chciałbym rozwiązanie, które nie opiera się na bibliotekach innych firm,
Czy nie ma na to standardowego sposobu?
AKTUALIZACJA
Nie polecaj Boost.
Jeśli Boost i Qt mogą to zrobić, z pewnością nie jest to magia, musi być coś standardowego, czego używają!
Odpowiedzi:
Możesz użyć gettimeofday na początku i na końcu metody, a następnie rozróżnić dwie struktury zwracające. Otrzymasz strukturę podobną do poniższej:
EDYCJA: Jak sugerują dwa poniższe komentarze, clock_gettime (CLOCK_MONOTONIC) jest znacznie lepszym wyborem, jeśli masz go dostępnym, co powinno być obecnie prawie wszędzie.
EDYCJA: Ktoś inny skomentował, że można również używać nowoczesnego C ++ ze std :: chrono :: high_resolution_clock, ale nie ma gwarancji, że będzie to monotoniczne. Zamiast tego użyj steady_clock.
źródło
CLOCK_MONOTONIC
świetnie nadaje się do unikania lokalnych korekt czasu systemu.źródło
POSIX.1-2008 marks gettimeofday() as obsolete, recommending the use of clock_gettime(2) instead.
@CTT, można zaktualizować przykład zmieniającstruct timeval
sięstruct timespec
, igettimeofday(&start, NULL)
abyclock_gettime(CLOCK_MONOTONIC, &start)
tak, że ludzie nie popaść w kłopoty?Należy pamiętać, że
clock
nie nie mierzyć czas zegar ścienny. Oznacza to, że jeśli twój program zajmuje 5 sekund,clock
niekoniecznie będzie mierzył 5 sekund, ale może więcej (twój program może uruchamiać wiele wątków, a więc może zużywać więcej procesora niż w czasie rzeczywistym) lub mniej. Mierzy przybliżenie używanego czasu procesora . Aby zobaczyć różnicę, rozważ ten kodWyprowadza w moim systemie
Ponieważ wszystko, co robiliśmy, to spanie i nie zużywanie czasu procesora! Jednak używając
gettimeofday
otrzymujemy to, czego chcemy (?)Wyjścia w moim systemie
Jeśli potrzebujesz większej precyzji, ale chcesz uzyskać czas procesora , możesz rozważyć użycie
getrusage
funkcji.źródło
sleep()
- Pomyślałem już o zadaniu pytania (dlaczego to działa dobrze dla wszystkich oprócz mnie ?!) , gdy znalazłem odpowiedź.Polecam również narzędzia oferowane przez Boost. Albo wspomniany Boost Timer, albo zhakuj coś z Boost.DateTime albo w piaskownicy pojawi się nowa proponowana biblioteka - Boost.Chrono : Ta ostatnia będzie zamiennikiem Timera i będzie zawierała:
duration
time_point
system_clock
monotonic_clock
high_resolution_clock
timer
z typami definicji:system_timer
monotonic_timer
high_resolution_timer
process_clock
, rejestrując rzeczywiste czasy procesora użytkownika i systemu.process_timer
, przechwytywanie czasu rzeczywistego, czasu procesora użytkownika i czasu procesora systemu.run_timer
, wygodne raportowanie | process_timer | wyniki.Oto źródło listy funkcji
źródło
Napisałem
Timer
zajęcia na podstawie odpowiedzi CTT . Można go używać w następujący sposób:Oto jego realizacja:
źródło
Jeśli nie potrzebujesz, aby kod był przenoszony na stare monitory, możesz użyć clock_gettime (), która poda czas w nanosekundach (jeśli twój procesor obsługuje tę rozdzielczość). To POSIX, ale od 2001 roku.
źródło
clock () ma często kiepską rozdzielczość. Jeśli chcesz mierzyć czas na poziomie milisekund, jedną z możliwości jest użycie metody clock_gettime (), as wyjaśniono w tym pytaniu.
(Pamiętaj, że musisz połączyć się z -lrt w systemie Linux).
źródło
Dzięki C ++ 11
std::chrono::high_resolution_clock
możesz to zrobić:Wynik:
Link do demo: http://cpp.sh/2zdtu
źródło
clock () nie zwraca milisekund ani sekund w systemie Linux. Zwykle clock () zwraca mikrosekundy w systemie Linux. Właściwym sposobem interpretacji wartości zwracanej przez funkcję clock () jest podzielenie jej przez CLOCKS_PER_SEC w celu ustalenia, ile czasu minęło.
źródło
To powinno działać ... przetestowane na komputerze Mac ...
Tak ... uruchom to dwa razy i odejmij ...
źródło
W standardzie POSIX
clock
wartość zwracana jest zdefiniowana w postaci symbolu CLOCKS_PER_SEC i implementacja może to zdefiniować w dowolny dogodny sposób. W Linuksie miałem szczęście z tątimes()
funkcją.źródło
gettimeofday - problem polega na tym, że jeśli zmienisz zegar sprzętowy (na przykład z NTP), mogą mieć niższe wartości. Boost - niedostępne dla tego projektu clock () - zwykle zwraca 4-bajtową liczbę całkowitą, co oznacza, że ma małą pojemność i po pewnym czasie zwraca liczby ujemne.
Wolę tworzyć własną klasę i aktualizować co 10 milisekund, więc ten sposób jest bardziej elastyczny, a nawet mogę go ulepszyć, aby mieć subskrybentów.
aby odświeżyć to używam setitimer:
Spójrz na setitimer oraz ITIMER_VIRTUAL i ITIMER_REAL.
Nie używaj funkcji alarmu lub ualarmu, uzyskasz niską precyzję, gdy proces będzie ciężki.
źródło
Wolę bibliotekę Boost Timer ze względu na jej prostotę, ale jeśli nie chcesz korzystać z bibliotek trzeciej strony, użycie clock () wydaje się rozsądne.
źródło
Jako aktualizacja wydaje się, że w systemie Windows clock () mierzy czas zegara ściennego (z dokładnością do CLOCKS_PER_SEC)
podczas gdy w Linuksie mierzy czas procesora na rdzeniach używanych przez bieżący proces
i (wydaje się, i jak zauważył oryginalny plakat) faktycznie z mniejszą precyzją niż CLOCKS_PER_SEC, chociaż może to zależy od konkretnej wersji Linuksa.
źródło
Podoba mi się metoda Hola Soy, która nie używa gettimeofday (). Zdarzyło mi się, że na działającym serwerze administrator zmienił strefę czasową. Zegar został zaktualizowany, aby pokazywał tę samą (poprawną) wartość lokalną. Spowodowało to przesunięcie funkcji time () i gettimeofday () o 2 godziny, a wszystkie znaczniki czasu w niektórych usługach utknęły.
źródło
Napisałem
C++
klasę używająctimeb
.Funkcje członków:
Przykład użycia:
Wyjście na moim komputerze to „19”. Dokładność
msTimer
klasy jest rzędu milisekund. W powyższym przykładzie użyciafor
śledzony jest całkowity czas wykonania zajęty przez -loop. W tym czasie system operacyjny włączał i wyłączał kontekst wykonania zmain()
powodu wielozadaniowości.źródło