web-dev-qa-db-fra.com

Comment mesurer le temps en C?

Je veux savoir pendant combien de temps (environ) un bloc de code s'exécute. Quelque chose comme ça:

startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);

Comment?

35
snakile

Vous pouvez utiliser la méthode clock dans time.h

Exemple:

clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
57
KLee1

Vous pouvez utiliser la bibliothèque time.h , en particulier les fonctions time et difftime :

/* difftime example */
#include <stdio.h>
#include <time.h>

int main ()
{
  time_t start,end;
  double dif;

  time (&start);
  // Do some calculation.
  time (&end);
  dif = difftime (end,start);
  printf ("Your calculations took %.2lf seconds to run.\n", dif );

  return 0;
}

(Exemple adapté de la page Web difftime liée ci-dessus.)

Veuillez noter que cette méthode ne peut donner que quelques secondes d’exactitude - time_t enregistre les secondes depuis l’époque UNIX (1er janvier 1970).

17
Stephen

GetTickCount ().

#include <windows.h>
void MeasureIt()
{
    DWORD dwStartTime = GetTickCount();
    DWORD dwElapsed;

    DoSomethingThatYouWantToTime();

    dwElapsed = GetTickCount() - dwStartTime;

    printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000);
}
2
selbie

Je voudrais utiliser les fonctions QueryPerformanceCounter et QueryPerformanceFrequency des fonctions de l'API Windows. Appelez l'ancien avant et après le bloc et soustrayez (ancien - actuel) pour obtenir le nombre de "ticks" entre les instances. Divisez cela par la valeur obtenue par cette dernière fonction pour obtenir la durée en secondes.

1
Andreas Rejbrand

Parfois, il est nécessaire de mesurer le temps astronomique plutôt que le temps de calcul (en particulier ceci s'applique sur Linux ):

#include <time.h>

double what_time_is_it()
{
    struct timespec now;
    clock_gettime(CLOCK_REALTIME, &now);
    return now.tv_sec + now.tv_nsec*1e-9;
}

int main() {
    double time = what_time_is_it();
    printf("time taken %.6lf\n", what_time_is_it() - time);
    return 0;
}
0
Ivan Talalaev

Si vous n'avez pas besoin d'une résolution fantastique, vous pouvez utiliser GetTickCount (): http://msdn.Microsoft.com/en-us/library/ms724408(VS.85).aspx (Si c'est pour quelque chose d’autre que vos propres diagnostics simples, notez que ce nombre peut s’envelopper, vous devrez donc le gérer avec un peu d’arithmétique).

QueryPerformanceCounter est une autre option raisonnable. (Il est également décrit sur MSDN)

0
user357501