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?
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.
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++
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