2017-06-12 10 views
4

Ich habe versucht, die Zeit zu messen, die für die Ausführung einer bestimmten Funktion in meinem Code benötigt wird. Am Anfang habe ich die clock() Funktion wie untenUnterschied in der Zeit gemessen von Uhr und steady_clock

clock_t start = clock(); 
do_something(); 
clock_t end = clock(); 

printf("Time taken: %f ms\n", ((double) end - start)*1000/CLOCKS_PER_SEC); 

Später ich über die chrono Bibliothek in C++11 lese und versuchte, das gleiche mit einem std::chrono::steady_clock wie unten

using namespace std::chrono; 

auto start = steady_clock::now(); 
do_something(); 
auto end = steady_clock::now(); 
printf("Time taken: %lld ms\n", duration_cast<milliseconds>(end - start).count()); 

Die Zeit vom ersten Code gemessen zu messen Schnipsel (unter Verwendung von clock) war 89.53 ms und der durch steady_clock gemessene Wert war 1140 ms.

Warum gibt es einen so großen Unterschied in der Zeit gemessen von beiden Uhren?

+0

Wenn möglich, könnten Sie bitte eine [mcve] erstellen? – Rakete1111

+0

@ Rakete1111: Hier ist der [Link] (http://coliru.stacked-crooked.com/a/9f74e57079978629) zu einem kleinen Testfall, wo das Problem reproduzierbar ist. –

Antwort

5

clock misst die Prozessorzeit, während steady_clock physikalische Zeit misst. So können Sie Unterschiede wie diese erhalten, wenn do_something() durch andere Prozesse (wie das Überprüfen von E-Mails oder was auch immer) vorweggenommen wurde.

Daniel H macht einen tollen Punkt unten in den Kommentaren, dass dies auch passieren kann, wenn do_something() nicht CPU-gebunden ist. Zum Beispiel, wenn es schläft, Blöcke beim Sperren eines Mutex, wartet auf eine Zustandsvariable usw.

+2

Das würde auch angezeigt werden ID 'do_something' ist nicht CPU-gebunden, oder? –

+0

@DanielH: Danke Daniel, guter Punkt. Ich habe deine Antwort zu meiner Antwort hinzugefügt. –

+0

@HowardHinnant Was wäre der richtige Ansatz, um die Zeit zu messen, die eine Funktion benötigt, die schlafen kann, Blöcke auf einem Mutex usw.? –

Verwandte Themen