warum C clock () 0 zurückgibt

8

Ich habe so etwas:

%Vor%

und ich bekomme immer als Ausgabe "Taktzyklen sind: 0 - 0"

Irgendeine Idee, warum das passiert?

(Um nur ein paar Details zu nennen, führt die something_else () - Funktion eine Potenzierung von links nach rechts mit Hilfe der Montgomery-Darstellung durch. Außerdem weiß ich nicht, dass die something_else () - Funktion tatsächlich eine nicht vernachlässigbare Zeit benötigt.)

Dies ist unter Linux. Das Ergebnis von uname -a ist:

Linux snowy.*****.ac.uk 2.6.32-71.el6.x86_64 #1 SMP Fri May 20 03:51:51 BST 2011 x86_64 x86_64 x86_64 GNU/Linux

    
eddy ed 26.03.2012, 11:13
quelle

6 Antworten

5

clock function misst keine CPU-Taktzyklen.

C sagt clock "gibt die beste Annäherung der Implementierung an den Prozessor zurück Zeit, die das Programm seit Beginn einer implementationsdefinierten Ära verwandt hat nur zum Programmaufruf. "

Wenn zwischen zwei aufeinander folgenden clock das Programm weniger Zeit benötigt als eine Einheit der Funktion clock , könnten Sie 0 erhalten.

POSIX clock definiert die Einheit mit CLOCKS_PER_SEC als 1000000 (Einheit ist dann 1 Mikrosekunde).

Ссылка

Um Taktzyklen in x86 / x64 zu messen, können Sie die Taktzahl des CPU-Zeitstempelzähler-Registers rdtsc durch Inline-Assemblierung abrufen.

    
ouah 26.03.2012, 12:06
quelle
5

Ich vermute, der Grund ist, dass Ihr something_else() so wenig Zeit verbraucht, dass die Genauigkeit von clock() überschritten wird. Ich habe versucht, clock() zweimal konsequent aufzurufen, und sowohl start als auch end ist null, aber das Ergebnis ist vernünftig, wenn ich zeitraubendes Zeug dazwischen tue.

Hier ist mein Testcode-Snippet:

%Vor%

Und das Ergebnis auf meinem Computer ist:

%Vor%

Auch zwei Tipps:

  1. Beim Testen verwendet keine Compiler-Optimierung . Sie können denken, dass Ihre something_else() zeitaufwendig ist, aber der Compiler ignoriert diese Operationen (besonders Schleifen), da sie sie für bedeutungslos halten.
  2. Verwenden Sie sizeof(clock_t) auf Ihrer Plattform, um die Größe von clock_t zu sehen.
Jinghao Shi 26.03.2012 12:29
quelle
4

Nun, willst du die Zeit, die something_else() braucht? Versuchen Sie Folgendes:

%Vor%

}

    
Enrique Marcos 26.03.2012 11:25
quelle
2

Der richtige Weg zur Verwendung von clock () zur Zeitmessung wäre:

%Vor%

Dies liegt daran, dass clock_t nicht unbedingt ein Int oder irgendein anderer Typ ist.

    
Guido 26.03.2012 11:27
quelle
2

Überprüfen Sie den Wert von CLOCKS_PER_SEC in time.h/clock.h . Auf meinem System zum Beispiel (Dev Cpp unter Windows 7) ist es nur ein 1000 . Soweit es mein Programm betrifft, gibt es 1000 Ticks pro Sekunde. Ihre something_else würde innerhalb von Mikrosekunden ausgeführt werden. Und daher gibt clock() vor und nach dem Funktionsaufruf null zurück.

Auf meinem System, wenn ich Ihre something_else durch eine zeitaufwendige Routine wie diese ersetzen

%Vor%

Ich bekomme

  

Taktzyklen sind: 10236 - 20593

Auf einem der Linux-Boxen finde ich folgendes in bits/time.h

%Vor%

Berücksichtigen Sie dies, bevor Sie den Rückgabewert von clock()

analysieren     
Pavan Manjunath 26.03.2012 11:26
quelle
0

Ich habe das kleine Programm unten verwendet, um Wanduhrzeit und CPU-Zeit zu untersuchen.

Auf meinem Testsystem druckt dies

CLOCKS_PER_SEC 1000000

CPU time usage resolutio n scheint 0.010000 seconds

zu sein

gettimeofday wurde um 9634 uS geändert, wenn sich die CPU-Zeit um 0.010000

geändert hat

gettimeofday Auflösung scheint 1 us

zu sein %Vor%     
user3782374 27.06.2014 09:03
quelle

Tags und Links