Wie messe ich die Zeit in C?

Lesezeit: 4 Minuten

Benutzeravatar von snakile
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?

  • @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

Benutzeravatar von KLee1
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

Benutzeravatar von Stephen
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.

Daniels Benutzeravatar
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 clockgibt 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.

Benutzeravatar von user357501
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)

1411270cookie-checkWie messe ich die Zeit in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy