Comment utiliser c time sous linux pour imprimer la fonction running time?

quand je lance le code c sous linux, le code n’imprime pas toujours le temps écoulé et le résultat est toujours égal à 0. Le code se présente comme suit:

#include  #include  #include  #include  void main(int argc,char* argv[]){ int n; if(argc == 2){ n = atoi(argv[1]); } struct timeval start, end; gettimeofday(&start, 0); int r = fib(n); gettimeofday(&end, 0); long mtime, s,us; s = end.tv_sec - start.tv_sec; us = end.tv_usec - start.tv_usec; printf("s=%f,us=%f \n", s, us); mtime = (s*1000 + us/1000.0)+0.5; printf("Fib result for %d is: %d;elapsing %f \n", n, r, mtime); } int fib(int n){ if(n == 0) return 0; if(n == 1) return 1; return fib(n-1)+fib(n-2); } 

Toutes les suggestions fonctionnent, mais la granularité de la mesure du temps est grande (généralement 10 à 100 millisecondes). Donc, cela mesure en réalité quelque chose pour un calcul qui dure par exemple une demi-seconde. Sur les processeurs actuels (de 2 à 3 GHz, avec environ 3 à 5 instructions par cycle), cela signifie environ un milliard d’instructions machine exécutées (une “étape élémentaire” dans notre programme C – avec une notion mal définie une douzaine d’instructions de la machine). Donc, votre test est trop petit, vous devriez vraiment calculer un million de fois Fibionacci (10).

Pour être plus spécifique, le programme ci-dessous (où certains calculs sont générés, pour éviter de les optimiser tous) s’exécute dans environ 2 secondes. (sur des millions de calculs de fibionacci de moins de 16).

 #include  #include  #include  long fib(int n){ if(n == 0) return 0; if(n == 1) return 1; return fib(n-1)+fib(n-2); } int main () { int i=0; int p = (int) getpid(); clock_t cstart = clock(); clock_t cend = 0; for (i=0; i<1000000; i++) { long f = fib(i%16); if (i % p == 0) printf("i=%d, f=%ld\n", i, f); } cend = clock(); printf ("%.3f cpu sec\n", ((double)cend - (double)cstart)* 1.0e-6); return 0; } 

Les dernières lignes sorties avec time ./fib (compilées avec gcc -O2 -Wall fib.c -o fib ) sont

 i=936079, f=610 i=948902, f=8 i=961725, f=233 i=974548, f=3 i=987371, f=89 2.140 cpu sec ./fib 2.15s user 0.00s system 99% cpu 2.152 total 

comparer une course inférieure à environ une seconde n'a pas beaucoup de sens

(et vous pouvez utiliser la commande time pour mesurer une telle course)

Voir aussi time (7) et clock_gettime (2) .

Ne négligez pas les avertissements de votre compilateur; vous essayez d’imprimer trois long variables ( mtime , s et us ) comme si elles étaient double s:

 fib.c: In function 'main': fib.c:17:3: warning: format '%f' expects type 'double', but argument 2 has type 'long int' fib.c:17:3: warning: format '%f' expects type 'double', but argument 3 has type 'long int' fib.c:19:3: warning: format '%f' expects type 'double', but argument 4 has type 'long int' 

Modifiez s et us en long , et changez le format pour s et us en %ld , et le programme comstack (et s’exécute) sans erreur.

Il pourrait être plus facile d’utiliser la fonction d’ clock :

 clock_t start = clock(); int r = fib(n); clock_t end = clock(); printf("Elapsed time: %.2f seconds\n", (double)(end - start) / CLOCKS_PER_SEC); 

La résolution de l’horloge en temps réel n’est probablement pas très petite (peut-être 10 ou 25 millisecondes) et votre calcul est trop court pour être significatif. Vous pouvez mettre votre calcul dans une boucle (par exemple, la répéter plusieurs milliers de fois).

Vous pouvez également envisager de mesurer le temps de calcul en utilisant la fonction horloge .

Vous pouvez également utiliser la fonction clock_gettime pour obtenir peut-être de meilleurs résultats.

Et comme d’autres personnes vous l’ont dit, veuillez demander tous les avertissements avec gcc -Wall et en tenir compte. Si vous y tenez après les performances (mais souvenez-vous que l’ optimisation prématurée est néfaste , commencez par bien configurer votre programme!), Activez les optimisations (par exemple, gcc -Wall -O2 ) pendant la compilation.

Cela devrait vous donner le temps écoulé:

 #include  #include  /* gettimeofday */ int main() { /* get begin time */ timeval begin; ::gettimeofday(&begin, 0); /* do something... */ ::usleep(153); /* get end time */ ::timeval current; ::gettimeofday(&current, (struct timezone*) 0); /* calculate difference */ double elapsed = (current.tv_sec - begin.tv_sec) + ((current.tv_usec - begin.tv_usec) / 1000000.0F); /* print it */ std::cout << elapsed << std::endl; return 0; }