Ich möchte herausfinden, wie viel Zeit eine bestimmte Funktion in meinem C++-Programm für die Ausführung unter Linux benötigt. Danach möchte ich einen Geschwindigkeitsvergleich machen. Ich habe mehrere Zeitfunktionen gesehen, bin aber bei dieser von boost gelandet. Chrono:
process_user_cpu_clock, captures user-CPU time spent by the current process
Wenn ich die obige Funktion verwende, erhalte ich dann nur die Zeit, die die CPU für diese Funktion aufgewendet hat?
Zweitens konnte ich kein Beispiel für die Verwendung der obigen Funktion finden. Kann mir jemand helfen, wie man die obige Funktion verwendet?
P.S.: Im Moment verwende ich "std::chrono::system_clock::now()", um die Zeit in Sekunden zu erhalten, aber das gibt mir jedes Mal unterschiedliche Ergebnisse aufgrund der unterschiedlichen CPU-Last.
Es ist eine sehr einfach zu verwendende Methode in C++11. Sie müssen std::chrono::high_resolution_clock
aus dem <chrono>
Header verwenden.
Benutzen Sie es wie folgt:
#include <iostream>
#include <chrono>
void function()
{
long long number = 0;
for( long long i = 0; i != 2000000; ++i )
{
number += 5;
}
}
int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
function();
auto t2 = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
std::cout << duration;
return 0;
}
Damit wird die Dauer der Funktion gemessen.
HINWEIS: Sie werden nicht immer die gleiche Zeit für eine Funktion erhalten. Das liegt daran, dass die CPU Ihres Rechners durch andere Prozesse, die auf Ihrem Computer laufen, mehr oder weniger ausgelastet sein kann, genauso wie Ihr Geist mehr oder weniger konzentriert sein kann, wenn Sie eine Matheaufgabe lösen. Der menschliche Verstand kann sich an die Lösung einer Rechenaufgabe erinnern, aber für einen Computer wird derselbe Prozess immer etwas Neues sein; daher werden Sie, wie gesagt, nicht immer dasselbe Ergebnis erhalten!
Hier ist eine Funktion, die die Ausführungszeit einer beliebigen Funktion misst, die als Argument übergeben wird:
#include <chrono>
#include <utility>
typedef std::chrono::high_resolution_clock::time_point TimeVar;
#define duration(a) std::chrono::duration_cast<std::chrono::nanoseconds>(a).count()
#define timeNow() std::chrono::high_resolution_clock::now()
template<typename F, typename... Args>
double funcTime(F func, Args&&... args){
TimeVar t1=timeNow();
func(std::forward<Args>(args)...);
return duration(timeNow()-t1);
}
Beispiel für die Verwendung:
#include <iostream>
#include <algorithm>
typedef std::string String;
//first test function doing something
int countCharInString(String s, char delim){
int count=0;
String::size_type pos = s.find_first_of(delim);
while ((pos = s.find_first_of(delim, pos)) != String::npos){
count++;pos++;
}
return count;
}
//second test function doing the same thing in different way
int countWithAlgorithm(String s, char delim){
return std::count(s.begin(),s.end(),delim);
}
int main(){
std::cout<<"norm: "<<funcTime(countCharInString,"precision=10",'=')<<"\n";
std::cout<<"algo: "<<funcTime(countWithAlgorithm,"precision=10",'=');
return 0;
}
Ausgabe:
norm: 15555
algo: 2976
einfaches Programm zur Ermittlung der benötigten Ausführungszeit einer Funktion.
#include <iostream>
#include <ctime> // time_t
#include <cstdio>
void function()
{
for(long int i=0;i<1000000000;i++)
{
// do nothing
}
}
int main()
{
time_t begin,end; // time_t is a datatype to store time values.
time (&begin); // note time before execution
function();
time (&end); // note time after execution
double difference = difftime (end,begin);
printf ("time taken for function() %.2lf seconds.\n", difference );
return 0;
}