16 votes

Comment puis-je trouver le temps d'exécution d'une section 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é à la fois time() et clock() à partir de time.h, mais il semble que time() renvoie des secondes et que clock() me donne des millisecondes (ou centisecondes ?) J'aimerais quelque chose de plus précis cependant. Existe-t-il un moyen de récupérer l'heure avec une précision d'au moins une microseconde ?

Il suffit qu'il puisse être compilé sous Linux.

1voto

Daren Thomas Points 26812

Vous pourriez chercher sur Google un instrumentation outil.

1voto

fizzer Points 8193

Vous ne trouverez pas d'appel de bibliothèque qui vous permette de dépasser la résolution d'horloge de votre plateforme. Vous pouvez soit utiliser un profileur (man gprof) comme l'a suggéré un autre posteur, soit - rapidement - mettre une boucle autour de la section de code incriminée pour l'exécuter plusieurs fois, et utiliser clock().

1voto

krakit Points 29

gettimeofday() vous fournit une résolution de microsecondes, alors que clock_gettime() permet d'obtenir une résolution de l'ordre de la nanoseconde.

int clock_gettime(clockid_t clk_id, struct timespec *tp);

Le site clk_id identifie l'horloge à utiliser. Utiliser CLOCK_REALTIME si vous voulez une horloge système visible par tous les processus. Utilisez CLOCK_PROCESS_CPUTIME_ID pour la minuterie par processus et CLOCK_THREAD_CPUTIME_ID pour une minuterie spécifique à un thread.

0voto

QAZ Points 2544

Si vous développez sur x86 ou x64, pourquoi ne pas utiliser le Time Stamp Counter : RDTSC .

Il sera plus fiable que les fonctions Ansi C comme time() ou clock() car le RDTSC est une fonction atomique. L'utilisation de fonctions C à cette fin peut poser des problèmes car vous n'avez aucune garantie que le thread dans lequel elles sont exécutées ne sera pas interrompu et, par conséquent, la valeur qu'elles renvoient ne sera pas une description précise du temps d'exécution réel que vous essayez de mesurer.

Avec le RDTSC, vous pouvez mieux le mesurer. Vous devrez reconvertir le nombre de tics dans un format de temps lisible par l'homme, H:M:S, qui dépendra de la fréquence d'horloge du processeur, mais cherchez sur Google et je suis sûr que vous trouverez des exemples.

Cependant, même avec RDTSC, vous inclurez le temps où votre code a été retiré de l'exécution, bien que ce soit une meilleure solution que d'utiliser time()/clock() si vous avez besoin d'une mesure exacte, vous devrez vous tourner vers un profileur qui instrumentera votre code et prendra en compte les moments où votre code n'est pas réellement exécuté en raison de changements de contexte ou autre.

0voto

Einstein Points 2935

Cela dépend des conditions.. Les profileurs sont agréables pour les vues globales générales, mais si vous avez vraiment besoin d'une vue précise, je vous recommande la méthode KISS. Exécutez simplement le code dans une boucle de telle sorte qu'il prenne une minute ou plus pour se terminer. Ensuite, calculez une moyenne simple basée sur le temps d'exécution total et les itérations exécutées.

Cette approche vous permet de :

  1. Obtenez des résultats précis avec des minuteurs à faible résolution.

  2. Ne pas rencontrer de problèmes lorsque l'instrumentation interfère avec les caches à haute vitesse (l2,l1,branch..etc) proches du processeur. Cependant, l'exécution du même code dans une boucle serrée peut également fournir des résultats optimistes qui peuvent ne pas refléter les conditions réelles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X