Der richtige Weg, clock() zum Messen der Zeit zu verwenden, wäre:
printf("\nTime elapsed: %.2f\n",1.0*(end-start)/CLOCKS_PER_SEC);
Dies liegt daran, dass clock_t nicht garantiert ein int oder irgendein anderer Typ ist.
Na, willst du die Zeit something_else()
nimmt? Versuchen Sie Folgendes:
#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;
}
Ich denke, der Grund ist, dass Ihre something_else()
verbraucht so wenig Zeit, dass die Genauigkeit von clock()
überschritten wird . Ich habe versucht, clock()
anzurufen zweimal hintereinander und beide start
und end
ist null, aber das Ergebnis ist vernünftig, wenn ich dazwischen einige zeitaufwändige Dinge erledige.
Hier ist mein Testcode-Snippet:
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;
}
Und das Ergebnis auf meinem Computer ist:
start = 0, end = 27700000
Außerdem zwei Tipps:
- Verwenden Sie beim Testen keine Compiler-Optimierung . Sie denken vielleicht, Ihr
something_else()
ist zeitaufwändig, aber der Compiler ignoriert diese Operationen (insbesondere Schleifen) möglicherweise einfach, da er sie für bedeutungslos hält. - Verwenden Sie
sizeof(clock_t)
auf Ihrer Plattform, um die Größe vonclock_t
zu sehen .
clock
Funktion misst keine CPU-Taktzyklen.
C sagt clock
"gibt die beste Annäherung der Implementierung zurück auf die vom Programm verbrauchte Prozessorzeit seit Beginn einer implementierungsdefinierten Ära, die sich nur auf den Programmaufruf bezieht."
Wenn zwischen zwei aufeinanderfolgenden clock
Aufrufe Ihres Programms dauert weniger Zeit als eine Einheit von clock
Funktion, könnten Sie 0
erhalten .
POSIX clock
definiert die Einheit mit CLOCKS_PER_SEC
als 1000000 (Einheit ist dann 1 Mikrosekunde).
http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html
Um Taktzyklen in x86/x64 zu messen, können Sie die Inline-Assemblierung verwenden, um die Taktzahl des CPU-Zeitstempelzählerregisters rdtsc
abzurufen .