Wśród funkcji czasowych, time
, clock
getrusage
, clock_gettime
, gettimeofday
i timespec_get
chcę, aby jasno zrozumieć, w jaki sposób są one realizowane i jakie są ich wartości zwracane w celu poznania, w którym sytuacja muszę ich używać.
Najpierw musimy sklasyfikować funkcje zwracające wartości zegara ściennego względem funkcji zwracających wartości procesów lub wątków . gettimeofday
zwraca wartość zegara ściennego, clock_gettime
zwraca wartość zegara lub wartości procesu lub wątków w zależności od Clock
przekazanego mu parametru. getrusage
i clock
zwracają wartości procesu.
Następnie drugie pytanie dotyczy realizacji tych funkcji, aw konsekwencji ich dokładności. Z jakiego mechanizmu sprzętowego lub programowego korzystają te funkcje.
Wygląda na to, że getrusage
używa tylko tiku jądra (zwykle 1 ms) i w konsekwencji nie może być dokładniejszy niż ms. Czy to jest poprawne? Wtedy getimeofday
funkcja wydaje się używać najdokładniejszego dostępnego sprzętu. W konsekwencji jego dokładność to zwykle mikrosekunda (nie może być większa z powodu API) na najnowszym sprzęcie. A co z tym clock
, że strona podręcznika mówi o "przybliżeniu", co to znaczy? A co z tym clock_gettime
, że API jest w nanosekundach, czy to oznacza, że może być tak dokładne, jeśli pozwala na to podstawowy sprzęt? A co z monotonią?
Czy są jakieś inne funkcje?
źródło
clock_gettime
, stąd zastosowaniegettimeofday()
bycia nieco bardziej wszechstronnym niżclock_gettime()
times()
(z s), które istniało w POSIX od wydania 1. Odnośnie GNU / Linuksa: Zgodnie ze stroną podręcznika clock (3),clock()
od glibc 2.17 i wcześniejszych zostało zaimplementowanych na wierzchu, ale dla ulepszenia precyzja, jest teraz zaimplementowana na szczycieclock_gettime(CLOCK_PROCESS_CPUTIME_ID,...)
, co jest również określone w POSIX, ale jest opcjonalne.time
igettimeofday
powracają, przynajmniej obecnie, sekundy od epoki (aka unix-timestamp). Jest to niezależne od stref czasowych / czasu letniego. Sekundy przestępne to inna historia ...C11
timespec_get
Przykład użycia pod adresem : https://stackoverflow.com/a/36095407/895245
Maksymalna możliwa zwracana precyzja to nanosekundy, ale rzeczywista precyzja jest zdefiniowana w ramach implementacji i może być mniejsza.
Zwraca czas ściany, a nie użycie procesora.
glibc 2.21 implementuje go pod
sysdeps/posix/timespec_get.c
i przekazuje bezpośrednio do:clock_gettime
iCLOCK_REALTIME
są POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html iman clock_gettime
mówi, że ta miara może mieć nieciągłości, jeśli zmienisz niektóre ustawienia czasu systemowego podczas działania programu.C ++ 11 chrono
Skoro już o tym mowa, omówmy je również: http://en.cppreference.com/w/cpp/chrono
GCC 5.3.0 (C ++ stdlib znajduje się wewnątrz źródła GCC):
high_resolution_clock
jest aliasem dlasystem_clock
system_clock
przechodzi do pierwszej z dostępnych opcji:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
przechodzi do pierwszej z dostępnych opcji:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
Pytanie: Różnica między std :: system_clock i std :: steady_clock?
CLOCK_REALTIME
vsCLOCK_MONOTONIC
: różnica między CLOCK_REALTIME i CLOCK_MONOTONIC?źródło