GNU/Linux >> LINUX-Kenntnisse >  >> Linux

warum C clock() 0 zurückgibt

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:

  1. 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.
  2. Verwenden Sie sizeof(clock_t) auf Ihrer Plattform, um die Größe von clock_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 .


Linux
  1. Warum ist Printf besser als Echo?

  2. Warum ist Cd kein Programm?

  3. Df vs. Du:Warum so viel Unterschied??

  4. Warum ist Nullglob kein Standard?

  5. Rc_status gibt immer „failed“ zurück?

Warum ich rxvt als Terminal verwende

Die 10 wichtigsten Gründe für die Verwendung von Linux

Warum Nerds Linux verwenden

Warum heißt Kubernetes K8s?

Warum nicht ICMP blockieren?

Warum ist mein rsync so langsam?