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.
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.
#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';
}
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
@Birger: In dem gesamten Projekt, in dem ich gearbeitet habe, benötigt der Code std std :: vor jedem std :: call. –
Gibt dies die Antwort in Sekunden zurück? –
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;
#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"
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. –
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
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
Stimmen Sie völlig damit überein – Martin
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";
}
Sie möchten vielleicht die erste Bedingung überprüfen ... 10 ms = 1 sec? –
Sorry Kumpel, du hattest Recht! –
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. –
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
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' –