Ich möchte herausfinden, wie lange (ungefähr) ein Codeblock ausgeführt wird. Etwas wie das:
startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);
Wie?
Schlange
Ich möchte herausfinden, wie lange (ungefähr) ein Codeblock ausgeführt wird. Etwas wie das:
startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);
Wie?
KLee1
Du kannst den … benutzen clock
Methode ein Zeit.h
Beispiel:
clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
+1: Schön und einfach. Allerdings müssen Sie nicht werfen (end - start)
zu einem Fließkomma vor der Division, wenn Sie Sekundenbruchteile erhalten möchten?
– Torak
24. August 2010 um 14:25 Uhr
Beachten Sie, dass clock()
misst die CPU-Zeit, nicht die Wanduhrzeit (dies kann oder kann nicht das sein, was Sie wollen).
– Café
25. August 2010 um 3:09 Uhr
@caf Während es unter Linux wahr ist, berechnet clock() tatsächlich die Wanduhrzeit unter Windows: msdn.microsoft.com/en-us/library/4e2ess30.aspx
– nicht definiert
26. September 2014 um 23:56 Uhr
@undefined: Nicht nur Linux, es ist eigentlich der C-Standard, der sagt “Das clock
Funktion bestimmt die verbrauchte Prozessorzeit.”. Ich nehme an, unter Windows können Sie einfach sagen, dass die beste Annäherung der Implementierung an die verwendete Prozessorzeit die verwendete Wanduhrzeit ist.
– Café
1. Oktober 2014 um 13:12 Uhr
Hinweis: Für alle, die verwirrt sind, CLOCKS_PER_SEC ist NICHT die Taktfrequenz Ihrer CPU.
– JAAAY
27. November 2017 um 20:50 Uhr
Stefan
Du kannst den … benutzen Zeit.h Bibliothek, insbesondere die Zeit und Differenzzeit Funktionen:
/* difftime example */
#include <stdio.h>
#include <time.h>
int main ()
{
time_t start,end;
double dif;
time (&start);
// Do some calculation.
time (&end);
dif = difftime (end,start);
printf ("Your calculations took %.2lf seconds to run.\n", dif );
return 0;
}
(Beispiel angepasst von der oben verlinkten Difftime-Webseite.)
Bitte beachten Sie, dass diese Methode nur Sekunden im Wert von Genauigkeit liefern kann – time_t
zeichnet die Sekunden seit dem auf UNIX-Epoche (1. Januar 1970).
Dies gibt nur Sekunden Genauigkeit. Und Ihr Beispiel verwendet die eigentlich nicht <ctime.h>
.
– Dummy00001
24. August 2010 um 15:15 Uhr
Entschuldigung, das ‘c’ war ein Tippfehler – die ctime-Bibliothek ist in definiert time.h
. Und ja, es gibt nur Sekundengenauigkeit. In Anbetracht dessen, dass auf dem Plakat “ungefähr” stand, hielt ich das für ausreichend. Ich werde meine Antwort so bearbeiten, dass sie die Tatsache enthält, dass sie nur Sekunden Genauigkeit liefert, wenn Sie dies wünschen.
– Stefan
24. August 2010 um 15:24 Uhr
Irgendwann muss man messen astronomische Zeit statt CPU-Zeit (insbesondere dies gilt für Linux):
#include <time.h>
double what_time_is_it()
{
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
return now.tv_sec + now.tv_nsec*1e-9;
}
int main() {
double time = what_time_is_it();
printf("time taken %.6lf\n", what_time_is_it() - time);
return 0;
}
GetTickCount().
#include <windows.h>
void MeasureIt()
{
DWORD dwStartTime = GetTickCount();
DWORD dwElapsed;
DoSomethingThatYouWantToTime();
dwElapsed = GetTickCount() - dwStartTime;
printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000);
}
Ich würde die verwenden QueryPerformanceCounter und QueryPerformanceFrequency Funktionen der Windows-API. Rufen Sie ersteres vor und nach dem Block auf und subtrahieren Sie (aktuell − alt), um die Anzahl der “Ticks” zwischen den Instanzen zu erhalten. Teilen Sie dies durch den Wert der letzteren Funktion, um die Dauer in Sekunden zu erhalten.
Daniel
Die Standard-C-Bibliothek stellt die time
Funktion und ist nützlich, wenn Sie nur Sekunden vergleichen müssen. Wenn Sie jedoch Millisekunden-Präzision benötigen, ist der portabelste Weg, anzurufen timespec_get
. Es kann die Zeit mit einer Genauigkeit von Nanosekunden anzeigen, wenn das System dies unterstützt. Der Aufruf erfordert jedoch etwas mehr Aufwand, da es sich um eine Struktur handelt. Hier ist eine Funktion, die die Struktur einfach in eine einfache 64-Bit-Ganzzahl konvertiert.
#include <stdio.h>
#include <inttypes.h>
#include <time.h>
int64_t millis()
{
struct timespec now;
timespec_get(&now, TIME_UTC);
return ((int64_t) now.tv_sec) * 1000 + ((int64_t) now.tv_nsec) / 1000000;
}
int main(void)
{
printf("Unix timestamp with millisecond precision: %" PRId64 "\n", millis());
}
nicht wie clock
gibt diese Funktion einen Unix-Zeitstempel zurück, damit sie die Zeit korrekt berücksichtigt, die zum Blockieren von Funktionen aufgewendet wird, wie z sleep
. Dies ist eine nützliche Eigenschaft zum Benchmarking und Implementieren von Verzögerungen, die die Laufzeit berücksichtigen.
Benutzer357501
Wenn Sie keine fantastische Auflösung benötigen, können Sie GetTickCount() verwenden: http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx
(Wenn es sich um etwas anderes als Ihre eigene einfache Diagnose handelt, beachten Sie, dass diese Nummer umlaufen kann, sodass Sie dies mit ein wenig Arithmetik handhaben müssen).
QueryPerformanceCounter ist eine weitere vernünftige Option. (Es ist auch auf MSDN beschrieben)
@Pmod Was meinst du mit Plattform? Mein Betriebssystem ist Windows.
– Schlange
24. August 2010 um 14:02 Uhr
Welche Auflösung möchten Sie erreichen und wie viel Overhead sind Sie bereit zu tolerieren?
– Noah Watkins
24. August 2010 um 14:08 Uhr
@Noah, ich kann einen Fehler von einer Millisekunde tolerieren
– Schlange
24. August 2010 um 15:27 Uhr
Eine Millisekunde ist eine lange Zeit. Die meisten Softwareuhren sind gut genug.
– Noah Watkins
24. August 2010 um 18:14 Uhr