Správný způsob použití clock() k měření času by byl:
printf("\nTime elapsed: %.2f\n",1.0*(end-start)/CLOCKS_PER_SEC);
Je to proto, že u clock_t není zaručeno, že jde o int nebo jiný typ.
No, chcete čas something_else()
bere? Zkuste toto:
#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;
}
Předpokládám, že důvodem je to, že vaše something_else()
spotřebuje tak málo času, že přesahuje přesnost clock()
. Zkusil jsem zavolat clock()
dvakrát za sebou a oba start
a end
je nula, ale výsledek je rozumný, když mezi tím dělám nějaké časově náročné věci.
Zde je můj úryvek testovacího kódu:
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;
}
A výsledek na mém počítači je:
start = 0, end = 27700000
Také dva tipy:
- Při testování nepoužívejte žádnou optimalizaci kompilátoru . Možná si myslíte, že vaše
something_else()
je časově náročné, ale kompilátor může tyto operace (zejména smyčky) ignorovat, protože je považuje za nesmyslné. - Použijte
sizeof(clock_t)
na vaší platformě zobrazíte velikostclock_t
.
clock
funkce neměří taktovací cykly CPU.
C říká clock
"vrací nejlepší aproximaci implementace na procesorový čas používaný programem od začátku implementace definované éry související pouze s vyvoláním programu."
Pokud mezi dvěma po sobě jdoucími clock
volání, které naprogramujete, trvá méně než jedna jednotka z clock
můžete získat 0
.
POSIX clock
definuje jednotu s CLOCKS_PER_SEC
jako 1000000 (jednotka je pak 1 mikrosekunda).
http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html
Chcete-li měřit hodinové cykly v x86/x64, můžete použít inline sestavu k načtení počtu hodin registru čítače CPU Time Stamp rdtsc
.