2010-03-28 3 views
4

j'ai trouvé un code sur la mesure du temps d'exécution ici http://www.dreamincode.net/forums/index.php?showtopic=24685temps d'exécution de mesure d'un appel à un système() en C++

Cependant, il ne semble pas fonctionner pour les appels au système(). J'imagine que c'est parce que l'exécution saute hors du processus actuel.

clock_t begin=clock(); 

system(something); 

clock_t end=clock(); 
cout<<"Execution time: "<<diffclock(end,begin)<<" s."<<endl; 

Puis

double diffclock(clock_t clock1,clock_t clock2) 
{ 
    double diffticks=clock1-clock2; 
    double diffms=(diffticks)/(CLOCKS_PER_SEC); 
    return diffms; 
} 

Cependant cela retourne toujours 0 secondes ... Y at-il une autre méthode qui fonctionne?

Aussi, c'est sous Linux.

Editer: Aussi, juste pour ajouter, le temps d'exécution est de l'ordre de quelques heures. Donc, la précision n'est pas vraiment un problème.

Merci!

+0

appels système et les appels à la fonction du système() ne sont nullement la même chose. J'ai modifié et mis à jour pour refléter cela. –

+0

Peut-être que l'appel système prend 0 secondes. Avez-vous essayé quelque chose de long exprès? –

+1

Notez qu'il y a deux fonctions à mesurer: le temps pris par le processus et le temps réel pris en compte. 'getrusage' peut mesurer la première résolution en microsecondes. 'gettimeofday' peut mesurer le second en résolution de microseconde. Si votre processus dort (en attente sur l'entrée ..), 'getrusage' n'en tiendra pas compte, il ne prendra pas non plus en compte les temps pris par les autres processus. Donc je suppose que si la tâche est E/S, vous voulez 'gettimeofday', et si c'est lié à cpu, vous voulez' getrusage'. Pas sûr que ce soit la bonne façon. –

Répondre

9

Avez-vous envisagé d'utiliser gettimeofday?

struct timeval tv; 
struct timeval start_tv; 

gettimeofday(&start_tv, NULL); 

system(something); 

double elapsed = 0.0; 

gettimeofday(&tv, NULL); 
elapsed = (tv.tv_sec - start_tv.tv_sec) + 
    (tv.tv_usec - start_tv.tv_usec)/1000000.0; 
+0

Merci cela fonctionne! – jm1234567890

0

Tuomas Pelkonen déjà présenté la méthode gettimeofday qui permet d'obtenir des temps avec une résolution à la microseconde.

Dans son exemple, il continue à convertir en double. J'ai personnellement enveloppé la struct timeval dans une classe de mes propres qui gardent les comptes en secondes et en microsecondes comme entiers et gérer les opérations d'ajout et de moins correctement. Je préfère garder des nombres entiers (avec des maths exactes) plutôt que d'obtenir des nombres de points flottants et tous leurs malheurs quand je peux.

+0

Pour le timing, ce n'est vraiment pas important d'être précis. Le niveau de gigue dans la plupart des temps signifie que vous n'avez probablement que quelques chiffres significatifs (à moins que l'appel ne prenne * très * beaucoup de temps, auquel cas vous pouvez le chronométrer avec une montre-bracelet). –

6

Malheureusement, clock() n'a qu'une seconde de résolution sous Linux (même s'il renvoie l'heure en unités de microsecondes).

Beaucoup de gens utilisent gettimeofday() pour l'analyse comparative, mais cela mesure le temps écoulé - pas le temps utilisé par ce processus/thread - n'est donc pas idéal. Évidemment, si votre système est plus ou moins inactif et que vos tests sont assez longs, vous pouvez faire la moyenne des résultats. Normalement moins d'un problème mais qui mérite d'être connu est que le temps retourné par gettimeofday() est non-monatonique - il peut sauter un peu par exemple. lorsque votre système se connecte pour la première fois à un serveur de temps NTP. La meilleure chose à utiliser pour l'analyse comparative est clock_gettime(), quelle que soit l'option la mieux adaptée à votre tâche.

  • CLOCK_THREAD_CPUTIME_ID - Horodateur CPU spécifique au thread.
  • CLOCK_PROCESS_CPUTIME_ID - Minuterie haute résolution par processus de la CPU.
  • CLOCK_MONOTONIC - Représente le temps monotone depuis un point de départ non spécifié.
  • CLOCK_REALTIME - Horloge temps réel à l'échelle du système.

NOTE cependant, que toutes les options sont prises en charge sur toutes les plateformes Linux - sauf clock_gettime (CLOCK_REALTIME) qui équivaut à gettimeofday().

Lien utile: Profiling Code Using clock_gettime

Questions connexes