La bonne façon d'utiliser clock() pour mesurer le temps serait :
printf("\nTime elapsed: %.2f\n",1.0*(end-start)/CLOCKS_PER_SEC);
En effet, il n'est pas garanti que clock_t soit un int, ou tout autre type d'ailleurs.
Eh bien, voulez-vous l'heure something_else()
prend? Essayez ceci :
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
struct timeval start, end;
long mtime, secs, usecs;
gettimeofday(&start, NULL);
something_else();
gettimeofday(&end, NULL);
secs = end.tv_sec - start.tv_sec;
usecs = end.tv_usec - start.tv_usec;
mtime = ((secs) * 1000 + usecs/1000.0) + 0.5;
printf("Elapsed time: %ld millisecs\n", mtime);
return 0;
}
Je suppose que la raison est que votre something_else()
consomme si peu de temps qu'il dépasse la précision de clock()
. J'ai essayé d'appeler le clock()
deux fois par conséquent et les deux start
et end
est égal à zéro, mais le résultat est raisonnable lorsque je fais des choses qui prennent du temps entre les deux.
Voici mon extrait de code de test :
int main(void) {
clock_t start, end;
start = clock();
int c;
for (int i = 0; i < 100; i++) {
for (int j = 0; j < (1<<30); j++) {
c++;
}
}
end = clock();
printf("start = %d, end = %d\n", start, end);
return 0;
}
Et le résultat sur mon ordinateur est :
start = 0, end = 27700000
Aussi, deux conseils:
- Lors des tests, n'utilisez aucune optimisation du compilateur . Vous pensez peut-être que votre
something_else()
prend du temps, mais le compilateur peut simplement ignorer ces opérations (en particulier les boucles) car il les considère comme dénuées de sens. - Utilisez
sizeof(clock_t)
sur votre plateforme pour voir la taille declock_t
.
clock
la fonction ne mesure pas les cycles d'horloge du processeur.
C dit clock
"renvoie la meilleure approximation de l'implémentation au temps processeur utilisé par le programme depuis le début d'une ère définie par l'implémentation liée uniquement à l'invocation du programme."
Si entre deux clock
successifs appelle votre programme prend moins de temps qu'une unité de clock
fonction, vous pourriez obtenir 0
.
POSIX clock
définit l'unité avec CLOCKS_PER_SEC
comme 1000000 (l'unité vaut alors 1 microseconde).
http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html
Pour mesurer les cycles d'horloge dans x86/x64, vous pouvez utiliser l'assemblage en ligne pour récupérer le nombre d'horloges du registre du compteur d'horodatage CPU rdtsc
.