La mesure du temps dans Linux - temps vs horloge vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?
Parmi les fonctions de chronométrage, 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 les utiliser.
Nous avons besoin d'abord de classer les fonctions de renvoi de l'horloge de mur valeurs comparer à des fonctions de retour processus ou threads valeurs. gettimeofday
renvoie l'horloge murale de la valeur, clock_gettime
renvoie l'horloge murale de la valeur ou processus ou threads valeurs en fonction de la Clock
paramètre passé à elle. getrusage
et clock
processus de retour des valeurs.
Ensuite, la deuxième question concerne la mise en œuvre de ces fonctions et, en conséquence, leur exactitude. Qui de logiciel ou de matériel mécanisme de ces fonctions.
Il semble que getrusage
utilise seulement le noyau de la tique (généralement de 1 ms de temps), et en conséquence ne peuvent pas être plus précis que le ms. Est-il juste?
Puis le getimeofday
fonction semble être d'utiliser le plus précis des matériels sous-jacents disponibles. Comme une conséquence de sa précision est généralement la microseconde (ne peut pas être plus en raison de l'API) sur un matériel récent.
Qu'en est clock
, la page de man de parler de "rapprochement", ça veut dire quoi?
Qu'en est clock_gettime
, l'API est dans l'ordre de la nanoseconde, ça signifie qu'il est capable d'être très précis si le matériel le permet? Ce sujet de monotonie?
Existe-il d'autres fonctions?
Vous devez vous connecter pour publier un commentaire.
Le problème est qu'il existe plusieurs fonctions de temps disponible en C et C++, et certaines d'entre elles varient dans le comportement entre les implémentations. Il y a aussi beaucoup de demi-réponses flottant autour. La compilation d'une liste des fonctions de l'horloge avec leurs propriétés permettrait de répondre à la question correctement. Pour les mises en chantier demandons à ce que les propriétés concernées sont que nous recherchons. En regardant ton post, je propose:
Avant de commencer la liste, je tiens à souligner que l'horloge murale est rarement le bon moment pour utiliser, alors qu'il change avec les changements de fuseau horaire, heure d'été, des changements, ou si le mur de l'horloge est synchronisée par le NTP. Aucune de ces choses sont bonnes si vous utilisez le temps de planifier des événements, ou à la performance de référence. Il n'y a vraiment que du bon pour ce que son nom indique, une horloge sur le mur (ou de bureau).
Voici ce que j'ai trouvé à ce jour pour les horloges dans Linux et OS X:
time()
renvoie l'horloge murale de l'OS, avec précision, dans les secondes.horloge()
semble renvoyer à la somme de l'utilisateur et le système de temps. Il est présent dans C89 et plus tard. À une époque, c'était censé être le temps de calcul dans les cycles, mais les normes modernes comme POSIX besoin CLOCKS_PER_SEC à 1000000, en donnant un maximum de précision possible à 1 µs. La précision sur mon système est en effet de 1 µs. Cette horloge s'enroule autour de une fois il est en tête (ce qui arrive généralement après ~2^32 tiques, ce qui n'est pas très long pour un pas de 1 MHz horloge).man clock
dit que, depuis la glibc 2.18 il est mis en œuvre avecclock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...)
dans Linux.clock_gettime(CLOCK_MONOTONIC, ...)
offre une résolution d'une, est monotone. Je crois que les "secondes" et "nanosecondes' sont stockés séparément, chacun dans des compteurs 32 bits. Ainsi, toute wrap-around aurait lieu après de nombreuses douzaine d'années de la durée de fonctionnement. Cela ressemble à une très bonne horloge, mais malheureusement, il n'est pas encore disponible sur OS X. POSIX 7 décritCLOCK_MONOTONIC
comme une extension optionnelle.getrusage()
s'est avéré être le meilleur choix pour ma situation. Il signale à l'utilisateur et du système de fois séparément et n'est pas autour. La précision sur mon système est de 1 µs, mais je l'ai aussi testé sur un système Linux (Red Hat 4.1.2-48 avec GCC 4.1.2) et il y a la précision était de 1 ms seulement.gettimeofday()
renvoie l'horloge murale avec (en théorie) µs précision. Sur mon système, cette horloge ne semblent avoir µs précision, mais ce n'est pas garanti, car "la résolution de l'horloge système est dépendant du matériel". POSIX.1-2008 date de dit que. "Les Applications doivent utiliser lesclock_gettime()
fonction de la place de la vétusté desgettimeofday()
fonction", donc, vous devriez rester loin de lui. Linux x86 et la met en œuvre comme un appel système.mach_absolute_time()
est une option pour une très haute résolution (ns) moment sur OS X. Sur mon système, c'est donner des ns de résolution. En principe, cette horloge s'enroule autour, cependant il est de stocker des ns aide d'une version 64 bits entier non signé, de sorte que l'emballage autour ne devrait pas être un problème dans la pratique. La portabilité est discutable.Tous les ci-dessus existent dans Linux et OS X, sauf indication contraire. "Mon système" dans le ci-dessus est un Apple exécutant OS X 10.8.3 avec GCC 4.7.2 de MacPorts.
Enfin, voici une liste de références que j'ai trouvé utile en plus les liens ci-dessus:
Mise à jour: pour OS X,
clock_gettime
a été mis en œuvre comme des 10.12 (Sierra). Aussi, les deux POSIX et BSD plateformes (comme OS X) partager larusage.ru_utime
struct champ.clock_gettime
, d'où l'utilisation degettimeofday()
un peu plus polyvalents queclock_gettime()
times()
(avec un s), qui a existé dans POSIX depuis le Numéro 1. Concernant GNU/Linux: en Fonction de l'horloge(3) l'homme page,clock()
de la glibc 2.17 et antérieures a été mis en œuvre sur le dessus de cela, mais pour une meilleure précision, il est maintenant mis en place sur le dessus declock_gettime(CLOCK_PROCESS_CPUTIME_ID,...)
, qui est également spécifiée dans POSIX, mais est facultative.clock_gettime(CLOCK_MONOTONIC_RAW, ...)
, qui est un très bon choix pour la mesure des durées de Linux. Il est important de noter, que monotone et ce n'est pas affectée par le NTP sont de deux choses différentes.time
etgettimeofday
retour, au moins de nos jours, de secondes depuis l'epoch (un.k.un. unix-les horodatages). Ceci est indépendant du temps des zones / de l'heure d'été. Les secondes intercalaires sont une autre histoire...C11
timespec_get
Exemple d'utilisation à: https://stackoverflow.com/a/36095407/895245
Le maximum de précision possible retournée est nanosecondes, mais la précision est définie par l'implémentation et pourrait être plus faible.
Il retourne mur du temps, pas d'utilisation de l'UC.
glibc 2.21 met en œuvre, sous
sysdeps/posix/timespec_get.c
et il la transmet directement à:clock_gettime
etCLOCK_REALTIME
sont POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html, etman clock_gettime
dit que cette mesure peut avoir des discontinuités si la modification d'un système de réglage de l'heure alors que votre programme s'exécute.C++11 chrono
Puisque nous y sommes, nous allons couvrir que bien: http://en.cppreference.com/w/cpp/chrono
GCC 5.3.0 (C++ stdlib est à l'intérieur de source de GCC):
high_resolution_clock
est un alias poursystem_clock
system_clock
à terme pour le premier de la suivante est disponible:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
à terme pour le premier de la suivante est disponible:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
Demandé à: Différence entre les std::system_clock et std::steady_clock?
CLOCK_REALTIME
vsCLOCK_MONOTONIC
: Différence entre CLOCK_REALTIME et CLOCK_MONOTONIC?