2010-07-10 13 views
101

Wie rufe ich clock() in C++?Wie benutze ich clock() in C++

Zum Beispiel möchte ich testen, wie viel Zeit eine lineare Suche benötigt, um ein bestimmtes Element in einem Array zu finden.

+0

Beachten Sie, dass die Wanduhrzeit nicht immer eine gute Möglichkeit ist, Mikrobenzin zu messen. Um konsistente Ergebnisse zu erzielen, müssen Sie die CPU-Frequenzskalierung umgehen (einschließlich Intel [turbo] (https://en.wikipedia.org/wiki/Intel_Turbo_Boost) oder das AMD-Äquivalent, das Ihre CPU-Uhr bei Wärme/Leistung höher schaltet Grenzen erlauben). Das Profiling mit Leistungsindikatoren kann Ihnen Messungen in Kerntaktzyklen (und auch Details darüber, ob ein Engpass Cachefehler vs. Instruktionsdurchsatz gegen Latenz ist, indem Sie auf andere Zähler als nur Zyklen schauen) geben. Unter Linux kommt 'perf stat -d./A.out' –

Antwort

167
#include <iostream> 
#include <cstdio> 
#include <ctime> 

int main() { 
    std::clock_t start; 
    double duration; 

    start = std::clock(); 

    /* Your algorithm here */ 

    duration = (std::clock() - start)/(double) CLOCKS_PER_SEC; 

    std::cout<<"printf: "<< duration <<'\n'; 
} 
+2

Von dem, was ich hier sehen kann http://www.cplusplus.com/reference/ctime/clock/, müssen Sie nicht die "std ::" -Notation verwenden. Benutze einfach "clock()" – gromit190

+1

@Birger: In dem gesamten Projekt, in dem ich gearbeitet habe, benötigt der Code std std :: vor jedem std :: call. –

+1

Gibt dies die Antwort in Sekunden zurück? –

27

clock() gibt die Anzahl der Zeitgeber seit dem Start des Programms zurück. Es gibt eine verwandte Konstante, CLOCKS_PER_SEC, die angibt, wie viele Clock-Ticks in einer Sekunde auftreten. So können Sie alle Funktionen wie folgt testen:

clock_t startTime = clock(); 
doSomeOperation(); 
clock_t endTime = clock(); 
clock_t clockTicksTaken = endTime - startTime; 
double timeInSeconds = clockTicksTaken/(double) CLOCKS_PER_SEC; 
+6

' timeInSeconds' für mich immer '0,000000'. Wie würde ich es reparieren? – noufal

+3

@noufal Vielleicht ist die Zeit, die du verbringst, so kurz, dass es als 0 angezeigt wird. Du könntest versuchen, ein 'langes Doppel 'zu verwenden, um mehr Präzision zu erhalten. – Gerard

0
#include <iostream> 
#include <ctime> 
#include <cstdlib> //_sleep() --- just a function that waits a certain amount of milliseconds 

using namespace std; 

int main() 
{ 

    clock_t cl;  //initializing a clock type 

    cl = clock(); //starting time of clock 

    _sleep(5167); //insert code here 

    cl = clock() - cl; //end point of clock 

    _sleep(1000); //testing to see if it actually stops at the end point 

    cout << cl/(double)CLOCKS_PER_SEC << endl; //prints the determined ticks per second (seconds passed) 


    return 0; 
} 

//outputs "5.17" 
+0

Dies fügt der bereits beantworteten Frage nicht hinzu. Schlaf nach cl = clock() - cl wird nicht benötigt. Und der Cout druckt Sekunden nicht Ticks pro Sekunde. cl speichert die Uhr ticks. –

48

eine alternative Lösung, die tragbar und mit höherer Genauigkeit ist, verfügbar seit C++ 11, ist std::chrono zu verwenden. Hier

ein Beispiel:

#include <iostream> 
#include <chrono> 
typedef std::chrono::high_resolution_clock Clock; 

int main() 
{ 
    auto t1 = Clock::now(); 
    auto t2 = Clock::now(); 
    std::cout << "Delta t2-t1: " 
       << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count() 
       << " nanoseconds" << std::endl; 
} 

Ausführen dieses auf ideone.com mir gab:

Delta t2-t1: 282 nanoseconds 
+3

Wenn Sie vorschlagen, C++ 11 zu verwenden, könnten Sie genauso gut 'using Clock = std :: chrono :: high_resolution_clock;' schreiben. Siehe [type alias] (http://en.cppreference.com/w/cpp/language/type_alias). – JHBonarius

+0

Stimmen Sie völlig damit überein – Martin

0

Wahrscheinlich könnten Sie daran interessiert sein Timer wie folgt aus: H: M: S. MSC.

der Code in Linux OS:

#include <iostream> 
#include <unistd.h> 

using namespace std; 
void newline(); 

int main() { 

int msec = 0; 
int sec = 0; 
int min = 0; 
int hr = 0; 


//cout << "Press any key to start:"; 
//char start = _gtech(); 

for (;;) 
{ 
     newline(); 
       if(msec == 1000) 
       { 
         ++sec; 
         msec = 0; 
       } 
       if(sec == 60) 
       { 
         ++min; 
         sec = 0; 
       } 
       if(min == 60) 
       { 
         ++hr; 
         min = 0; 
       } 
     cout << hr << " : " << min << " : " << sec << " . " << msec << endl; 
     ++msec; 
     usleep(100000); 

} 

    return 0; 
} 

void newline() 
{ 
     cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; 
} 
+0

Sie möchten vielleicht die erste Bedingung überprüfen ... 10 ms = 1 sec? –

+0

Sorry Kumpel, du hattest Recht! –

+1

Dadurch wird ein relativer Fehler in der Zeit akkumuliert, weil Sie nicht die Zeit zum Ausdrucken einschließen, und 'usleep' wird nicht immer genau nach dem Betrag zurückgeben, um den Sie bitten. Manchmal wird es länger sein. Sie sollten die aktuelle Zeit beim Start überprüfen, dann die aktuelle Zeit überprüfen und subtrahieren, um die absolute Zeit zu erhalten, seit Sie jedes Mal durch die Schleife gegangen sind. –

1

Unter Windows zumindest die nur praktisch eine genaue Messung Mechanismus ist Queryperformancecounter (QPC). std :: chrono wird mit diesem implementiert (seit VS2015, wenn Sie das verwenden), aber es ist nicht genau in dem gleichen Maße wie QueryPerformanceCounter direkt verwenden. Insbesondere ist der Anspruch, bei 1 Nanosekunden Granularität zu berichten, absolut nicht korrekt. Wenn Sie also etwas messen, das nur sehr kurze Zeit benötigt (und Ihr Fall könnte nur ein solcher Fall sein), sollten Sie QPC oder das Äquivalent für Ihr Betriebssystem verwenden. Ich bin auf dieses Problem gestoßen, als ich die Cache-Latenzzeiten gemessen habe, und ich notierte mir einige Notizen, die Sie hier nützlich finden könnten. https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md