Il modo corretto di utilizzare clock() per misurare il tempo sarebbe:
printf("\nTime elapsed: %.2f\n",1.0*(end-start)/CLOCKS_PER_SEC);
Questo perché non è garantito che clock_t sia un int o qualsiasi altro tipo.
Bene, vuoi l'ora something_else()
prende? Prova questo:
#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;
}
Immagino che il motivo sia che il tuo something_else()
consuma così poco tempo che supera la precisione di clock()
. Ho provato a chiamare clock()
due volte di conseguenza ed entrambi start
e end
è zero, ma il risultato è ragionevole quando eseguo alcune operazioni che richiedono tempo.
Ecco il mio frammento di codice di prova:
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;
}
E il risultato sul mio computer è:
start = 0, end = 27700000
Inoltre, due consigli:
- Durante il test, non utilizzare alcuna ottimizzazione del compilatore . Potresti pensare che il tuo
something_else()
richiede molto tempo, ma il compilatore potrebbe semplicemente ignorare tali operazioni (specialmente i cicli) poiché le considera prive di significato. - Usa
sizeof(clock_t)
sulla tua piattaforma per vedere la dimensione diclock_t
.
clock
la funzione non misura i cicli di clock della CPU.
C dice clock
"restituisce la migliore approssimazione dell'implementazione al tempo del processore utilizzato dal programma dall'inizio di un'era definita dall'implementazione relativa solo all'invocazione del programma."
Se tra due clock
successivi chiama il tuo programma richiede meno tempo di una unità del clock
funzione, potresti ottenere 0
.
POSIX clock
definisce l'unità con CLOCKS_PER_SEC
come 1000000 (l'unità è quindi 1 microsecondo).
http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html
Per misurare i cicli di clock in x86/x64 è possibile utilizzare l'assembly inline per recuperare il conteggio del clock del registro del contatore del timestamp della CPU rdtsc
.