Sous Windows, clock()
renvoie le temps en millisecondes, mais sur cette machine Linux sur laquelle je travaille, il l'arrondit au 1000 le plus proche, donc la précision est uniquement au niveau "deuxième" et non au niveau des millisecondes.
J'ai trouvé une solution avec Qt en utilisant la QTime
classe, en instanciant un objet et en l'appelant start()
, puis en appelant elapsed()
pour obtenir le nombre de millisecondes écoulées.
J'ai eu de la chance parce que je travaille avec Qt pour commencer, mais j'aimerais une solution qui ne repose pas sur des bibliothèques tierces,
N'y a-t-il pas de moyen standard de le faire?
METTRE À JOUR
Veuillez ne pas recommander Boost.
Si Boost et Qt peuvent le faire, ce n'est sûrement pas magique, il doit y avoir quelque chose de standard qu'ils utilisent!
Réponses:
Vous pouvez utiliser gettimeofday au début et à la fin de votre méthode, puis différencier les deux structures de retour. Vous obtiendrez une structure comme celle-ci:
EDIT: Comme le suggèrent les deux commentaires ci-dessous, clock_gettime (CLOCK_MONOTONIC) est un bien meilleur choix si vous l'avez disponible, ce qui devrait être presque partout ces jours-ci.
EDIT: Quelqu'un d'autre a commenté que vous pouvez également utiliser le C ++ moderne avec std :: chrono :: high_resolution_clock, mais cela n'est pas garanti pour être monotone. Utilisez plutôt regular_clock.
la source
CLOCK_MONOTONIC
c'est idéal pour éviter les ajustements d'heure système localisés.la source
POSIX.1-2008 marks gettimeofday() as obsolete, recommending the use of clock_gettime(2) instead.
@CTT, pourriez-vous mettre à jour l'exemple en changeant lestruct timeval
enstruct timespec
, etgettimeofday(&start, NULL)
enclock_gettime(CLOCK_MONOTONIC, &start)
pour que les gens n'aient pas de problèmes?Veuillez noter que
clock
ne mesure pas l' heure de l'horloge murale. Cela signifie que si votre programme prend 5 secondes,clock
ne mesurera pas nécessairement 5 secondes, mais pourrait plus (votre programme pourrait exécuter plusieurs threads et pourrait donc consommer plus de CPU que le temps réel) ou moins. Il mesure une approximation du temps CPU utilisé. Pour voir la différence, considérez ce codeIl sort sur mon système
Parce que tout ce que nous avons fait était de dormir et de ne pas utiliser de temps CPU! Cependant, en utilisant
gettimeofday
nous obtenons ce que nous voulons (?)Sorties sur mon système
Si vous avez besoin de plus de précision mais que vous souhaitez obtenir du temps CPU , vous pouvez envisager d'utiliser la
getrusage
fonction.la source
sleep()
- Je pense déjà poser une question (pourquoi cela fonctionne-t-il bien pour tout le monde sauf moi?!) , Lorsque vous avez trouvé votre réponse.Je recommande également les outils proposés par Boost. Soit le Boost Timer mentionné, soit pirater quelque chose de Boost.DateTime ou il y a une nouvelle bibliothèque proposée dans le bac à sable - Boost.Chrono : Ce dernier remplacera le Timer et comprendra:
duration
time_point
system_clock
monotonic_clock
high_resolution_clock
timer
Modèle de classe , avec typedefs:system_timer
monotonic_timer
high_resolution_timer
process_clock
, capturant les temps réels, CPU utilisateur et CPU système.process_timer
, capturant les temps réels écoulés entre l'UC utilisateur et l'UC système.run_timer
, rapport pratique de | process_timer | résultats.Voici la source de la liste des fonctionnalités
la source
J'ai écrit un
Timer
cours basé sur la réponse de CTT . Il peut être utilisé de la manière suivante:Voici sa mise en œuvre:
la source
Si vous n'avez pas besoin que le code soit portable sur les anciens unices, vous pouvez utiliser clock_gettime (), qui vous donnera l'heure en nanosecondes (si votre processeur prend en charge cette résolution). C'est POSIX, mais depuis 2001.
la source
clock () a une résolution souvent assez médiocre. Si vous souhaitez mesurer le temps au niveau de la milliseconde, une alternative consiste à utiliser clock_gettime (), comme expliqué dans cette question.
(N'oubliez pas que vous devez créer un lien avec -lrt sous Linux).
la source
Avec C ++ 11 et
std::chrono::high_resolution_clock
vous pouvez le faire:Production:
Lien vers la démo: http://cpp.sh/2zdtu
la source
clock () ne renvoie pas les millisecondes ou les secondes sous Linux. Habituellement, clock () renvoie des microsecondes sur un système Linux. La bonne façon d'interpréter la valeur renvoyée par clock () est de la diviser par CLOCKS_PER_SEC pour savoir combien de temps s'est écoulé.
la source
Cela devrait fonctionner ... testé sur un mac ...
Ouais ... lancez-le deux fois et soustrayez ...
la source
Dans la norme POSIX,
clock
sa valeur de retour est définie en termes du symbole CLOCKS_PER_SEC et une implémentation est libre de la définir de n'importe quelle manière appropriée. Sous Linux, j'ai eu de la chance avec latimes()
fonction.la source
gettimeofday - le problème est qu'il peut avoir des valeurs inférieures si vous changez votre horloge matérielle (avec NTP par exemple) Boost - non disponible pour ce projet clock () - renvoie généralement un entier de 4 octets, ce qui signifie que sa capacité est faible, et après un certain temps, il renvoie des nombres négatifs.
Je préfère créer ma propre classe et la mettre à jour toutes les 10 millisecondes, donc cette façon est plus flexible, et je peux même l'améliorer pour avoir des abonnés.
pour le rafraîchir, j'utilise setitimer:
Regardez setitimer et les ITIMER_VIRTUAL et ITIMER_REAL.
N'utilisez pas les fonctions d'alarme ou d'ualarm, vous aurez une faible précision lorsque votre processus sera dur.
la source
Je préfère la bibliothèque Boost Timer pour sa simplicité, mais si vous ne voulez pas utiliser de bibliothèques tierces, utiliser clock () semble raisonnable.
la source
En tant que mise à jour, apparaît que sur windows clock () mesure l'heure de l'horloge murale (avec la précision CLOCKS_PER_SEC)
tandis que sous Linux, il mesure le temps CPU à travers les cœurs utilisés par le processus actuel
et (il semble, et comme indiqué par l'affiche originale) en fait avec moins de précision que CLOCKS_PER_SEC, bien que cela dépende peut-être de la version spécifique de Linux.
la source
J'aime la méthode Hola Soy de ne pas utiliser gettimeofday (). Cela m'est arrivé sur un serveur en cours d'exécution, l'administrateur a changé le fuseau horaire. L'horloge a été mise à jour pour afficher la même valeur locale (correcte). Cela a provoqué un décalage de 2 heures de la fonction time () et gettimeofday () et tous les horodatages de certains services sont restés bloqués.
la source
J'ai écrit une
C++
classe en utilisanttimeb
.Fonctions des membres:
Exemple d'utilisation:
La sortie sur mon ordinateur est «19». La précision de la
msTimer
classe est de l'ordre de la milliseconde. Dans l'exemple d'utilisation ci-dessus, le temps total d'exécution occupé par lafor
boucle -loop est suivi. Cette fois, le système d'exploitation entre et sort du contexte d'exécution enmain()
raison du multitâche.la source