Comment puis-je trouver le temps d'exécution d'une partie de mon programme en C?
J'essaie de trouver un moyen d'obtenir le temps d'exécution d'une section de code en C. j'ai déjà essayé deux fois() et de l'horloge() de temps.h, mais il semble que le temps() renvoie des secondes et de l'horloge() semble me donner millisecondes (ou centièmes de seconde?) Je voudrais quelque chose de plus précis. Est-il possible que je peux attraper le temps avec au moins microseconde de précision?
Ce ne doit être en mesure de compiler sur Linux.
OriginalL'auteur Stephen Booher | 2008-10-06
Vous devez vous connecter pour publier un commentaire.
Vous visées à
clock()
ettime()
- avez-vous été à la recherche pourgettimeofday()
?Qui va remplir un
struct timeval
, qui contient secondes et microsecondes.Bien sûr, la résolution réelle est en place pour le matériel.
OriginalL'auteur
Pour ce que ça vaut, en voici une qui est juste un peu de macros:
Puis il suffit de l'utiliser avec:
De http://ctips.pbwiki.com/Timer
OriginalL'auteur
Vous voulez un profiler application.
De recherche de mots-clés et DONC les moteurs de recherche: linux profilage
OriginalL'auteur
Ont un coup d'oeil à gettimeofday,
clock_*, ou get/setitimer.
OriginalL'auteur
Essayer "le banc.h"; il vous permet de mettre un START_TIMER; et STOP_TIMER("nom"); dans votre code, vous permettant de référence arbitrairement une section de code (note: recommandé uniquement pour de courtes sections, et non pas les choses en prenant des dizaines de millisecondes ou plus). Sa précision de l'horloge du cycle, bien que dans certains cas rares, il peut changer la façon dont le code est compilé, dans ce cas, vous êtes mieux avec un profiler (même si ceux-ci sont généralement plus d'efforts pour les utiliser pour des articles de code).
Il ne fonctionne que sur x86.
Pour quiconque a ajouté la remarque à propos de ce défaut sur les systèmes multi-core: je l'ai supprimé, car il est tout simplement incorrecte. La macro gère automatiquement les changements de contexte et d'autres changements brusques de RDTSC valeurs, donc pas de probleme de ce genre existe. Je l'utilise exclusivement le multi-core machines et il fonctionne très bien.
Sombre Shikari: Cela ne peut être correcte, Cette macro ne peut pas gérer les choses comme préférentiel de souscription des changements de contexte. Il tout simplement pas. Il va produire des résultats, mais ils ne seront pas précises. Aussi le temps qu'elle renvoie est calibré pour un processeur Core2 (en raison de #define NOP_CYCLES) & aurait besoin d'être modifié pour répondre aux besoins.
OriginalL'auteur
Vous pourriez vouloir à google pour un instrumentation outil.
OriginalL'auteur
Vous ne trouverez pas un appel de la bibliothèque qui vous permet d'obtenir le passé de l'horloge de la résolution de votre plate-forme. Soit utiliser un profiler (homme gprof) comme une autre affiche a été suggéré, ou - rapide & sale - mettre une boucle autour de la délinquance de la section de code à exécuter de nombreuses fois, et l'utilisation de l'horloge().
OriginalL'auteur
gettimeofday()
vous offre une résolution de quelques microsecondes, alors queclock_gettime()
vous offre une résolution de nanosecondes.La
clk_id
identifie l'horloge à être utilisé. UtilisationCLOCK_REALTIME
si vous voulez un système à l'échelle de l'horloge visible à tous les processus. UtilisationCLOCK_PROCESS_CPUTIME_ID
pour chaque processus de la minuterie etCLOCK_THREAD_CPUTIME_ID
pour un thread spécifique de la minuterie.OriginalL'auteur
Il dépend des conditions.. Profileurs sont agréables pour l'ensemble des vues toutefois, si vous avez vraiment besoin d'une vision précise et ma recommandation est de BAISER. Il suffit d'exécuter le code dans une boucle, tel que cela prend une minute pour terminer. Ensuite, on calcule une moyenne simple basé sur le temps d'exécution et les itérations exécutées.
Cette approche permet de:
Obtenir des résultats précis avec une faible résolution des chronomètres.
Courez pas dans les problèmes où l'instrumentation interfère avec la haute la vitesse de la mémoire cache (l2,l1,direction etc..) à proximité du processeur. Cependant exécutant le même code dans une boucle serrée, peut également fournir des résultats optimistes qui peuvent ne pas refléter les conditions du monde réel.
OriginalL'auteur
Ne sais pas qui de l'environnement/système d'exploitation que vous travaillez, mais votre temps peut être inexacte si un autre thread, une tâche ou un processus, anticipe sur votre chronométré code dans le milieu. Je suggère d'explorer des mécanismes tels que les mutex ou les sémaphores pour empêcher les autres threads preemting votre processus.
OriginalL'auteur
Si vous développez sur x86 ou x64, pourquoi ne pas utiliser le Time Stamp Counter: RDTSC.
Il sera plus fiable, Ansi C, comme les fonctions time() ou une horloge() RDTSC est atomique fonction. À l'aide de fonctions C pour cela peut introduire des problèmes que vous avez aucune garantie que le fil qu'ils sont en cours d'exécution ne sera pas mis à l'écart et en conséquence, la valeur de leur retour ne sera pas une description exacte de l'exécution réelle du temps que vous essayez de mesurer.
Avec RDTSC vous pouvez mieux mesurer ce. Vous aurez besoin de convertir le nombre de graduation de retour dans une lisible par l'homme heure H:M:S format qui dépendra de la fréquence d'horloge des processeurs, mais autour de google et je suis sûr que vous trouverez des exemples.
Cependant, même avec RDTSC vous serez en incluant le temps de votre code a été mis hors d'exécution, tandis qu'une meilleure solution que d'utiliser time()/clock() si vous avez besoin d'une mesure exacte, vous aurez à se tourner vers un profiler qui sera l'instrument de votre code et de prendre en compte lors de votre code n'est pas réellement de l'exécution en raison de changements de contexte ou de quoi que ce soit.
OriginalL'auteur