Berechnen der verstrichenen Zeit in einem C-Programm in Millisekunden

Lesezeit: 3 Minuten

Benutzer-Avatar
Benutzer69514

Ich möchte die Zeit in Millisekunden berechnen, die für die Ausführung eines Teils meines Programms benötigt wird. Ich habe online gesucht, aber es gibt nicht viele Informationen zu diesem Thema. Weiß einer von euch wie das geht?

  • Retagged mehr im Einklang mit der Konvention.

    – dmckee — Ex-Moderator-Kätzchen

    23. September 2009 um 21:45 Uhr

  • hm … habe ich diese Frage nicht vor einer Woche beantwortet: stackoverflow.com/questions/1444428/…

    – Christoph

    23. September 2009 um 22:37 Uhr

Am besten antwortest du mit einem Beispiel:

#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

/* Return 1 if the difference is negative, otherwise 0.  */
int timeval_subtract(struct timeval *result, struct timeval *t2, struct timeval *t1)
{
    long int diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
    result->tv_sec = diff / 1000000;
    result->tv_usec = diff % 1000000;

    return (diff<0);
}

void timeval_print(struct timeval *tv)
{
    char buffer[30];
    time_t curtime;

    printf("%ld.%06ld", tv->tv_sec, tv->tv_usec);
    curtime = tv->tv_sec;
    strftime(buffer, 30, "%m-%d-%Y  %T", localtime(&curtime));
    printf(" = %s.%06ld\n", buffer, tv->tv_usec);
}

int main()
{
    struct timeval tvBegin, tvEnd, tvDiff;

    // begin
    gettimeofday(&tvBegin, NULL);
    timeval_print(&tvBegin);

    // lengthy operation
    int i,j;
    for(i=0;i<999999L;++i) {
        j=sqrt(i);
    }

    //end
    gettimeofday(&tvEnd, NULL);
    timeval_print(&tvEnd);

    // diff
    timeval_subtract(&tvDiff, &tvEnd, &tvBegin);
    printf("%ld.%06ld\n", tvDiff.tv_sec, tvDiff.tv_usec);

    return 0;
}

Eine andere Option (zumindest auf einigen UNIX) ist clock_gettime und damit verbundene Funktionen. Diese ermöglichen den Zugriff auf verschiedene Echtzeituhren und Sie können eine der höheren Auflösungen auswählen und die nicht benötigte Auflösung wegwerfen.

  • Besonders die CLOCK_MONOTONIC Uhr, wenn das System, auf dem Sie laufen, dies unterstützt (sysconf(_SC_MONOTONIC_CLOCK) > 0).

    – Café

    23. September 2009 um 23:16 Uhr

Das gettimeofday Funktion gibt die Zeit mit Mikrosekunden-Präzision zurück (wenn die Plattform das natürlich unterstützen kann):

Die Funktion gettimeofday() erhält die aktuelle Zeit, ausgedrückt in Sekunden und Mikrosekunden seit der Epoche, und speichert sie in der timeval-Struktur, auf die tp zeigt. Die Auflösung der Systemuhr ist nicht spezifiziert.

  • gettimeofday eignet sich nicht gut zum Messen der verstrichenen Zeit zwischen zwei Ereignissen, da die Uhrzeit des Systems zwischen den Ereignissen geändert werden kann (z. B. durch ein NTP-Update oder einfach durch eine Administratoraktion). (Manchmal es ist das Beste, was es gibt).

    – Café

    23. September 2009 um 23:14 Uhr

Benutzer-Avatar
gbarry

C-Bibliotheken haben eine Funktion, mit der Sie die Systemzeit abrufen können. Sie können die verstrichene Zeit berechnen, nachdem Sie die Start- und Stoppzeiten erfasst haben.

Die Funktion heißt gettimeofday() und Sie können in der Manpage nachsehen, was Sie einbinden und wie Sie sie verwenden.

Unter Windows können Sie einfach Folgendes tun:

DWORD dwTickCount = GetTickCount();

// Perform some things.

printf("Code took: %dms\n", GetTickCount() - dwTickCount);

Nicht die allgemeinste/eleganteste Lösung, aber nett und schnell, wenn Sie es brauchen.

1350530cookie-checkBerechnen der verstrichenen Zeit in einem C-Programm in Millisekunden

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

Privacy policy