La funzione C `clock ()` restituisce solo uno zero
Domanda
La funzione C clock()
mi restituisce uno zero. Ho provato ad utilizzare tipi diversi, senza alcun miglioramento ... E 'questo un buon modo per misurare il tempo con buona precisione?
#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
Piattaforma: Intel a 32 bit, RedHat Linux, gcc 3.4.6
Soluzione
clock()
riporta il tempo di CPU utilizzata. sleep()
non utilizza alcun tempo di CPU. Così il risultato è probabilmente esattamente corretto, non solo ciò che si desidera.
Altri suggerimenti
man clock
. Non è di tornare quello che si pensa che sia. Inoltre man gettimeofday
- è più probabile che ciò che si desidera
clock_t è di tipo intero. Non è possibile stampare fuori con% f. Vedi di Fred risposta per il motivo per cui la differenza è 0.
printf("start = %.20f\nend = %.20f\n", start, end);
dovrebbe essere:
printf("start = %d\nend = %d\n", start, end);
La chiamata sleep()
non ha intenzione di utilizzare qualsiasi tempo di CPU. Si dovrebbe vedere un piccolo differenza, però. Ho corretto il tipo di printf non corrispondente bug in questa linea:
printf("start = %.20f\nend = %.20f\n", start, end);
E ha dato risultati ragionevoli sulla mia macchina:
start = 1419
end = 1485
delta = 66
cpu_time_used = 0.000066000000000
CLOCKS_PER_SEC = 1000000
Si potrebbe provare gettimeofday()
di ottenere il tempo reale trascorso l'esecuzione del programma.
Probabilmente, è necessario
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
e l'uso di qualcosa come
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;
al posto di
clock()
come orologio solo e soltanto conta il tempo trascorso in CPU basata solo su contatori di prestazioni. ma è possibile ottenere risultato utilizzando la funzione di cui sopra. solo per verificare l'applicazione eseguirlo con il comando di tempo
come time ./a.out
output del comando time:
real 0m5.987s
user 0m0.674s
sys 0m0.134s
e l'uscita della funzione personalizzata
Wall Time = 5.98505
CPU Time = 0.8