C: Verwenden von clock() zum Messen der Zeit in Multithread-Programmen

Lesezeit: 2 Minuten

Ich habe immer clock() verwendet, um zu messen, wie viel Zeit meine Anwendung von Anfang bis Ende gedauert hat, als;

int main(int argc, char *argv[]) {
  const clock_t START = clock();

  // ...

  const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC;
}

Seit ich angefangen habe, POSIX-Threads zu verwenden, scheint dies fehlzuschlagen. Es sieht so aus, als ob clock() mit N Threads N-mal schneller zunimmt. Da ich nicht weiß, wie viele Threads gleichzeitig ausgeführt werden, schlägt dieser Ansatz fehl. Wie kann ich also messen, wie viel Zeit vergangen ist?

  • Siehe Ist gettimeofday() garantiert eine Mikrosekundenauflösung?

    – Matthäus Flaschen

    3. Juni 2010 um 1:25 Uhr


  • Siehe diese Antwort für eine portable Lösung: stackoverflow.com/questions/361363/…

    – Alexander Saprikin

    27. Juni 2016 um 13:56 Uhr

Benutzeravatar von caf
Café

clock() Messen Sie die CPU-Zeit, die von Ihrem Prozess verwendet wird, nicht die Uhrzeit. Wenn Sie mehrere Threads gleichzeitig ausführen, können Sie die CPU-Zeit natürlich viel schneller verbrennen.

Wenn Sie die Ausführungszeit der Wanduhr wissen möchten, müssen Sie eine entsprechende Funktion verwenden. Der einzige in ANSI C ist time()die normalerweise nur eine Auflösung von 1 Sekunde hat.

Wie Sie jedoch sagten, verwenden Sie POSIX, was bedeutet, dass Sie verwenden können clock_gettime()definiert in time.h. Das CLOCK_MONOTONIC Insbesondere die Uhr eignet sich dafür am besten:

struct timespec start, finish;
double elapsed;

clock_gettime(CLOCK_MONOTONIC, &start);

/* ... */

clock_gettime(CLOCK_MONOTONIC, &finish);

elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;

(Beachten Sie, dass ich die Berechnung von durchgeführt habe elapsed sorgfältig, um sicherzustellen, dass die Präzision nicht verloren geht, wenn sehr kurze Intervalle gemessen werden).

Wenn Ihr Betriebssystem dies nicht bietet CLOCK_MONOTONIC (mit dem Sie zur Laufzeit überprüfen können sysconf(_SC_MONOTONIC_CLOCK)), dann können Sie verwenden CLOCK_REALTIME als Fallback – aber beachten Sie, dass letzteres den Nachteil hat, dass es falsche Ergebnisse liefert, wenn die Systemzeit geändert wird, während Ihr Prozess läuft.

  • >> Dies ist die richtige Antwort, wie sie von @caf im Ozean vieler irreführender Antworten auf SO gepostet wurde. Dies gilt insbesondere für Echtzeitsysteme, die POSIX unterstützen. Ich würde Uhr, Uhrzeit, gettimeofday oder andere Funktionen für diesen Zweck NICHT verwenden. <<

    – Xofo

    25. Mai 2016 um 18:45 Uhr


  • Was meinst du mit “sorgfältig” rechnen? elapsed? Hat es eine Bedeutung, zwei separate Anweisungen zu verwenden, anstatt sie zu einer Aufgabe zu kombinieren?

    – Sevko

    4. Dezember 2016 um 17:47 Uhr

  • @sevko: Nein, es könnte in einer Anweisung gemacht werden – worauf ich mich beziehe, ist das Subtrahieren beider ‘Sekunden’-Teile getrennt von beiden ‘Nanosekunden’-Teilen, anstatt (zum Beispiel) ‘Finish’ und ‘Start’ in umzuwandeln Gleitkommawerte zuerst und subtrahieren sie dann.

    – Café

    4. Dezember 2016 um 23:04 Uhr

  • Dies funktioniert zwar, wenn kein Thread schläft, misst aber die verbleibende CPU-Zeit nach jedem Frame.

    – Benutzer877329

    21. März 2017 um 10:33 Uhr

  • Fehlender Namensraum? der Bezeichner “clock_gettime” ist undefiniert. auch für CLOCK_MONOTONIC

    – Pedro77

    23. April 2017 um 15:24 Uhr

Benutzeravatar von Manfre
Manfre

Welche zeitliche Auflösung benötigen Sie? Sie könnten time() von time.h für die zweite Auflösung verwenden. Wenn Sie eine höhere Auflösung benötigen, können Sie etwas Systemspezifischeres verwenden. Siehe Timer-Funktion zum Bereitstellen von Zeit in Nanosekunden mit C++

1411620cookie-checkC: Verwenden von clock() zum Messen der Zeit in Multithread-Programmen

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

Privacy policy