Wie rufe ich clock()
an C++
?
Ich möchte beispielsweise testen, wie viel Zeit eine lineare Suche benötigt, um ein bestimmtes Element in einem Array zu finden.
Wie rufe ich clock()
an C++
?
Ich möchte beispielsweise testen, wie viel Zeit eine lineare Suche benötigt, um ein bestimmtes Element in einem Array zu finden.
Antworten:
#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';
}
clock()
und clock_t
stammen aus dem Header der C Standard Library von time.h
und benötigen daher std
nach der Aufnahme ihrer Bibliotheken keine Namespace-Präfixe. <ctime>
Umschließt diesen Wert und diese Funktion mit dem std
Namespace, muss jedoch nicht verwendet werden. Überprüfen Sie hier für Implementierungsdetails: en.cppreference.com/w/cpp/header/ctime
Eine alternative Lösung, die portabel und präziser ist und seit C ++ 11 verfügbar ist, ist die Verwendung std::chrono
.
Hier ist 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;
}
Das auf ideone.com auszuführen gab mir:
Delta t2-t1: 282 nanoseconds
using Clock=std::chrono::high_resolution_clock;
. Siehe Typalias .
std::chrono::high_resolution_clock
ist nicht bei allen Standard-Lib-Implementierungen monoton. Aus der Referenz - Im Allgemeinen sollte man nur std :: chrono :: stetige Uhr oder std :: chrono :: system_clock direkt anstelle von std :: chrono :: high_resolution_clock verwenden: benutze stetige Uhr für Dauermessungen und system_clock für die Wanduhrzeit.
clock()
Gibt die Anzahl der Uhr-Ticks seit dem Start Ihres Programms zurück. Es gibt eine verwandte Konstante, CLOCKS_PER_SEC
die angibt, wie viele Taktstriche in einer Sekunde auftreten. So können Sie jede Operation wie folgt testen:
clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;
timeInSeconds
kommt immer 0.000000
für mich. Wie würde ich das beheben?
long double
zu verwenden, um mehr Präzision zu erzielen .
Zumindest unter Windows ist QueryPerformanceCounter (QPC) der einzige praktisch genaue Messmechanismus. std :: chrono wird damit implementiert (seit VS2015, wenn Sie das verwenden), aber es ist nicht in demselben Maße genau wie die direkte Verwendung von QueryPerformanceCounter. Insbesondere ist die Behauptung, bei 1 Nanosekunde Granularität zu melden, absolut nicht korrekt. Wenn Sie also etwas messen, das nur sehr kurze Zeit in Anspruch nimmt (und Ihr Fall könnte ein solcher Fall sein), sollten Sie QPC oder das Äquivalent für Ihr Betriebssystem verwenden. Ich bin beim Messen der Cache-Latenzen darauf gestoßen und habe einige Notizen notiert, die Sie hier möglicherweise nützlich finden. https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md
#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"
Wahrscheinlich interessieren Sie sich für einen Timer wie diesen: H: M: S. Msec.
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";
}
usleep
nicht immer nach genau dem Betrag zurückkehren, den Sie angefordert haben. Manchmal wird es länger dauern. Sie sollten die aktuelle Zeit zu Beginn überprüfen, dann die aktuelle Zeit überprüfen und subtrahieren, um die absolute Zeit zu erhalten, seit Sie jedes Mal durch die Schleife gestartet sind.
Sie können messen, wie lange Ihr Programm funktioniert. Die folgenden Funktionen helfen beim Messen der CPU-Zeit seit dem Start des Programms:
meine Referenz : Algorithmus Toolbox Woche 1 Kurs Teil der Spezialisierung auf Datenstrukturen und Algorithmen durch die University of California in San Diego und die Higher School of Economics der National Research University
Sie können diese Codezeile also nach Ihrem Algorithmus hinzufügen
cout << (double)clock() / CLOCKS_PER_SEC ;
Erwartete Ausgabe: Die Ausgabe, die die Anzahl von darstellt clock ticks per second
perf stat -d ./a.out