Comment puis-je obtenir le temps d'exécution d'un programme en millisecondes en C?
Actuellement, je suis de l'exécution de la paroi du temps de mon programme dans secondes en appelant le:
time_t startTime = time(NULL);
//section of code
time_t endTime = time(NULL);
double duration = difftime(endTime, startTime);
Est-il possible d'obtenir le mur de temps en millisecondes? Si oui, comment?
je ne peux pas multiplier le résultat avec 1000
OriginalL'auteur alex | 2010-02-07
Vous devez vous connecter pour publier un commentaire.
Si vous êtes sur une POSIX-ish machine, utiliser
gettimeofday()
à la place, qui vous donne raisonnable de la portabilité et de la microseconde résolution.Un peu plus ésotérique, mais aussi dans POSIX, est le
clock_gettime()
fonction, ce qui vous donne l'ordre de la nanoseconde résolution.Sur de nombreux systèmes, vous trouverez une fonction
ftime()
qui renvoie en fait vous avez le temps en secondes et millisecondes. Cependant, il n'est plus dans la Single Unix Specification (à peu près le même que POSIX). Vous avez besoin de l'en-tête<sys/timeb.h>
:Cela remonte à la Version 7 (ou 7ème Édition) Unix au moins, ainsi, il a été très largement disponibles.
J'ai aussi des notes dans mon sous-deuxième timer code sur
times()
etclock()
, qui utilisent d'autres structures et les en-têtes de nouveau. J'ai aussi des notes sur Windows à l'aide declock()
avec 1000 tops d'horloge par seconde (milliseconde timing), et une ancienne interfaceGetTickCount()
qui est à noter que nécessaire sur Windows 95, mais pas sur NT.gettimeofday()
est officiellement marqué "obsolète" par POSIX 2008. Cela ne signifie pas qu'il est fait pour demain, mais l'écriture est sur le mur.OriginalL'auteur Jonathan Leffler
Si vous pouvez faire cela en dehors du programme lui-même, dans linux, vous pouvez utiliser
time
de commande (time ./my_program
).Jusqu'voté mais pas la compréhension du temps à l'utilisateur , sys temps ?
OriginalL'auteur poundifdef
J'ai récemment écrit un post de blog qui explique comment faire pour obtenir l'heure en millisecondes de la croix-plate-forme.
Il fonctionnera comme time(NULL), mais retourne le nombre de millisecondes au lieu de secondes depuis l'époque unix sur windows et linux.
Voici le code
Vous pouvez la modifier pour revenir à la microseconde à la place de milliesconds si vous le souhaitez.
OriginalL'auteur Andreas Bonini
De l'open-source GLib la bibliothèque dispose d'un GTimer système qui prétend fournir une précision. Cette bibliothèque est disponible sur Mac OS X, Windows, et Linux. Je suis en train de l'utiliser pour faire de la performance des timings sur Linux, et il semble fonctionner parfaitement.
OriginalL'auteur Bob Murphy
gprof
, qui fait partie de la trousse à outils GNU, est une option. La plupart POSIX systèmes ont installé, et il est disponible sous Cygwin pour Windows. Le suivi du temps vous-même à l'aide degettimeofday()
fonctionne très bien, mais c'est la performance équivalente à l'utilisation des instructions d'impression pour le débogage. Il est bon si vous voulez juste un moyen rapide et sale de la solution, mais ce n'est pas très élégant, en utilisant les outils appropriés.À utiliser
gprof
, vous devez spécifier le-pg option lors de la compilation avecgcc
comme dans:Ensuite, vous pouvez exécuter
gprof
sur le programme généré comme suit:Par défaut, gprof va générer l'ensemble de la durée de fonctionnement de votre programme, ainsi que la quantité de temps passé dans chaque fonction, le nombre de fois que chaque fonction a été appelée, le temps moyen passé dans chaque appel de fonction, et d'autres informations similaires.
Il y a un grand nombre d'options que vous pouvez définir avec
gprof
. Si vous êtes intéressés, vous trouverez plus d'informations dans les pages de manuel ou par le biais de Google.OriginalL'auteur Swiss
Sur Windows, utilisez QueryPerformanceCounter et les associés QueryPerformanceFrequency. Ils ne vous donnent pas un temps qui est traduisible calendrier de temps, donc si vous avez besoin de demander l'aide d'un tube CATHODIQUE de l'API et ensuite l'utiliser immédiatement QueryPerformanceCounter. Vous pouvez ensuite faire une simple addition/soustraction pour calculer le calendrier de temps, avec certaines des erreurs en raison du temps nécessaire à l'exécution de l'API de façon consécutive. Hey, c'est un PC, à quoi vous attendiez-vous???
QueryPerformanceCounter ne fonctionne pas à la vitesse du PROCESSEUR de commutateur de modes, qui sont si populaires aujourd'hui. Le sous-jacent PerformanceCounterFrequency change rapidement, et il ne peut être utilisé pour de petites mesures.
c'est ridicule. Il n'est pas une flamme de souligner qu'un non-système d'exploitation temps réel ne peut pas faire précis des mesures de temps d'événements.
Votre commentaire est incompatible avec la documentation du système d'exploitation, qui stipule que le compteur de performance de fréquence est constante sur l'exécution d'un OS. Il y a eu des défauts qui ont causé le comportement que vous décrivez, mais ils ont été patché. Voir le site MSDN: msdn.microsoft.com/en-us/library/ms644905%28VS.85%29.aspx
Vu le doc, c'est intéressant. Il semble qu'il y êtes les Processeurs intel qui permettent ce, malgré la vitesse de course (plus HALs avant l'appel à la CPU de l'instruction de la requête, les horloges compteur). Je ne vois pas comment cela est possible sur les autres Processeurs.
OriginalL'auteur David Gladfelter