Quelle est la différence entre std::system_clock
et std::steady_clock
? (Un exemple de cas illustrant différents résultats / comportements serait formidable).
Si mon objectif est de mesurer précisément le temps d'exécution des fonctions (comme un benchmark), quel serait le meilleur choix entre std::system_clock
, std::steady_clock
et std::high_resolution_clock
?
system_clock
n'est pas stable sur Windows. Sous Windows, l'heure système peut être modifiée à n'importe quelle valeur arbitraire par tout utilisateur suffisamment privilégié. De plus, le service de synchronisation de l'heure peut ajuster l'heure du système en arrière si nécessaire. Je m'attends à ce que la plupart des autres plates-formes aient des fonctionnalités similaires permettant d'ajuster l'heure du système.Réponses:
Depuis N3376:
20.11.7.1 [time.clock.system] / 1:
20.11.7.2 [heure.horloge.steady] / 1:
20.11.7.3 [time.clock.hires] / 1:
Par exemple, l'horloge à l'échelle du système peut être affectée par quelque chose comme l'heure d'été, auquel moment l'heure réelle indiquée à un moment donné dans le futur peut en fait être une heure du passé. (Par exemple aux États-Unis, à l'automne, le temps recule d'une heure, de sorte que la même heure est vécue "deux fois") Cependant, il
steady_clock
n'est pas autorisé à être affecté par de telles choses.Une autre façon de penser "stable" dans ce cas est dans les exigences définies dans le tableau du 20.11.3 [time.clock.req] / 2:
C'est tout ce que la norme a sur leurs différences.
Si vous voulez faire un benchmarking, votre meilleur pari sera probablement
std::high_resolution_clock
, car il est probable que votre plate-forme utilise une minuterie haute résolution (par exempleQueryPerformanceCounter
sous Windows) pour cette horloge. Cependant, si vous effectuez une analyse comparative, vous devriez vraiment envisager d'utiliser des minuteries spécifiques à la plate-forme pour votre référence, car différentes plates-formes gèrent cela différemment. Par exemple, certaines plates-formes peuvent vous donner des moyens de déterminer le nombre réel de cycles d'horloge requis par le programme (indépendamment des autres processus exécutés sur le même processeur). Mieux encore, mettez la main sur un véritable profileur et utilisez-le.la source
steady_clock
etsystem_clock
ici.system_clock
soit UTC.Billy a fourni une excellente réponse basée sur la norme ISO C ++ avec laquelle je suis entièrement d'accord. Cependant, il y a un autre aspect de l'histoire - la vraie vie. Il semble que pour le moment, il n'y ait vraiment aucune différence entre ces horloges dans la mise en œuvre des compilateurs populaires:
gcc 4.8:
Visual Studio 2012:
Dans le cas de gcc, vous pouvez vérifier si vous gérez une horloge régulière simplement en vérifiant
is_steady
et en vous comportant en conséquence. Cependant VS2012 semble tricher un peu ici :-)Si vous avez besoin d'une horloge haute précision, je vous recommande pour l'instant d'écrire votre propre horloge conforme à l'interface d'horloge officielle C ++ 11 et d'attendre que les implémentations rattrapent leur retard. Ce sera une bien meilleure approche que d'utiliser une API spécifique au système d'exploitation directement dans votre code. Pour Windows, vous pouvez le faire comme ça:
Pour Linux, c'est encore plus facile. Lisez simplement la page de manuel
clock_gettime
et modifiez le code ci-dessus.la source
Implémentation de GCC 5.3.0
C ++ stdlib est à l'intérieur de 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
Alors
CLOCK_REALTIME
vsCLOCK_MONOTONIC
est expliqué à: Différence entre CLOCK_REALTIME et CLOCK_MONOTONIC?la source
Peut-être, la différence la plus significative est le fait que le point de départ de
std::chrono:system_clock
est le 1.1.1970, soi-disant époque UNIX. De l'autre côté, pourstd::chrono::steady_clock
généralement le temps de démarrage de votre PC et il est le plus approprié pour mesurer les intervalles.la source