Parmi les fonctions de synchronisation, time
, clock
getrusage
, clock_gettime
, gettimeofday
et timespec_get
, je veux bien comprendre comment ils sont mis en œuvre et quelles sont leurs valeurs de retour afin de savoir dans quelle situation je dois les utiliser.
Nous devons d'abord classer les fonctions retournant des valeurs d'horloge murale par rapport aux fonctions retournant des valeurs de processus ou de threads . gettimeofday
retours valeur d'horloge de mur, clock_gettime
renvoie la valeur d'horloge de mur ou de processus ou des valeurs de fils en fonction du Clock
paramètre qui lui est passé. getrusage
et clock
renvoyer les valeurs de processus.
Ensuite, la deuxième question concerne la mise en œuvre de ces fonctions et par conséquent leur exactitude. Quel mécanisme matériel ou logiciel ces fonctions utilisent-elles?
Il semble qu'il getrusage
n'utilise que le tick du noyau (généralement 1 ms de long) et par conséquent ne peut pas être plus précis que le ms. Est ce juste? Ensuite, la getimeofday
fonction semble utiliser le matériel sous-jacent le plus précis disponible. En conséquence, sa précision est généralement de la microseconde (ne peut pas être plus à cause de l'API) sur du matériel récent. Qu'en est-il clock
, la page de manuel parle d '"approximation", qu'est-ce que cela signifie? Qu'en est-il clock_gettime
, l'API est en nanoseconde, cela signifie-t-il qu'elle peut être si précise si le matériel sous-jacent le permet? Qu'en est-il de la monotonie?
Y a-t-il d'autres fonctions?
la source
clock_gettime
, d'où l'utilité d'gettimeofday()
être un peu plus polyvalent queclock_gettime()
times()
(avec un s), qui existe dans POSIX depuis le numéro 1. Concernant GNU / Linux: Selon la page de manuel clock (3),clock()
de la glibc 2.17 et versions antérieures a été implémentée par-dessus, mais pour une amélioration précision, il est maintenant implémenté par-dessusclock_gettime(CLOCK_PROCESS_CPUTIME_ID,...)
, ce qui est également spécifié dans POSIX mais est facultatif.time
etgettimeofday
retournent, au moins de nos jours, secondes depuis l'époque (c'est-à-dire horodatages unix). Ceci est indépendant des fuseaux horaires / heure d'été. Les secondesC11
timespec_get
Exemple d'utilisation sur: https://stackoverflow.com/a/36095407/895245
La précision maximale possible renvoyée est de nanosecondes, mais la précision réelle est définie par l'implémentation et peut être plus petite.
Il renvoie l'heure du mur, pas l'utilisation du processeur.
la glibc 2.21 l'implémente sous
sysdeps/posix/timespec_get.c
et la transmet directement à:clock_gettime
etCLOCK_REALTIME
sont POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html , etman clock_gettime
indique que cette mesure peut avoir des discontinuités si vous modifiez certains paramètres de l'heure du système pendant que votre programme s'exécute.Chrono C ++ 11
Puisque nous y sommes, couvrons-les également: http://en.cppreference.com/w/cpp/chrono
GCC 5.3.0 (C ++ stdlib est dans la source GCC):
high_resolution_clock
est un alias poursystem_clock
system_clock
transfère au premier des éléments suivants disponibles:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
transfère au premier des éléments suivants disponibles:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
Question posée à: Différence entre std :: system_clock et std :: regular_clock?
CLOCK_REALTIME
vsCLOCK_MONOTONIC
: Différence entre CLOCK_REALTIME et CLOCK_MONOTONIC?la source