L'horloge de C `()` fonction retourne un zéro juste
Question
La fonction C clock()
me retourne un zéro. J'ai essayé d'utiliser différents types, sans amélioration ... Est-ce une bonne façon de mesurer le temps avec une bonne précision?
#include <time.h>
#include <stdio.h>
int main()
{
clock_t start, end;
double cpu_time_used;
char s[32];
start = clock();
printf("\nSleeping 3 seconds...\n\n");
sleep(3);
end = clock();
cpu_time_used = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);
printf("start = %.20f\nend = %.20f\n", start, end);
printf("delta = %.20f\n", ((double) (end - start)));
printf("cpu_time_used = %.15f\n", cpu_time_used);
printf("CLOCKS_PER_SEC = %i\n\n", CLOCKS_PER_SEC);
return 0;
}
Sleeping 3 seconds... start = 0.00000000000000000000 end = 0.00000000000000000000 delta = 0.00000000000000000000 cpu_time_used = 0.000000000000000 CLOCKS_PER_SEC = 1000000
Plate-forme: Intel 32 bits, Linux RedHat, gcc 3.4.6
La solution
clock()
rapports temps CPU utilisé. sleep()
ne pas utiliser de temps CPU. Ainsi, le résultat est probablement tout à fait correct, mais pas ce que vous voulez.
Autres conseils
man clock
. Il ne revient pas ce que vous pensez qu'il est. Aussi man gettimeofday
- il est plus probable que vous voulez
clock_t est un type entier. Vous ne pouvez pas l'imprimer avec% f. Voir réponse de Fred pourquoi la différence est 0.
printf("start = %.20f\nend = %.20f\n", start, end);
devrait être:
printf("start = %d\nend = %d\n", start, end);
L'appel sleep()
ne va pas utiliser jusqu'à tout temps CPU. Vous devriez voir un petit différence, cependant. Je corrige votre incompatibilité de type printf bug dans cette ligne:
printf("start = %.20f\nend = %.20f\n", start, end);
Et il a donné des résultats raisonnables sur ma machine:
start = 1419
end = 1485
delta = 66
cpu_time_used = 0.000066000000000
CLOCKS_PER_SEC = 1000000
Vous pouvez essayer gettimeofday()
pour obtenir le temps réel passé à exécuter votre programme.
Vous avez probablement
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
et quelque chose comme l'utilisation
double wall0 = get_wall_time();
double cpu0 = get_cpu_time();
for(long int i = 0; i<=10000000;i++){
func1();
}
double wall1 = get_wall_time();
double cpu1 = get_cpu_time();
cout << "Wall Time = " << wall1 - wall0 << endl;
cout << "CPU Time = " << cpu1 - cpu0 << endl;
au lieu de
clock()
comme horloge et uniquement compte le temps passé dans CPU uniquement basées sur les compteurs de performance. mais vous pouvez obtenir le résultat en utilisant la fonction ci-dessus. juste pour vérifier votre application exécuter avec la commande de temps
comme time ./a.out
sortie de commande de temps:
real 0m5.987s
user 0m0.674s
sys 0m0.134s
et la sortie de fonction personnalisée
Wall Time = 5.98505
CPU Time = 0.8