Zeitmessung
-
Hallo!
Ich hab gerade mit C++ angefangen. Da ich schon früher Java und Basic programmiert habe, habe ich zum Spass mal ne Bubblesort programmiert und würde jetzt gerne mal die Laufzeit testen und gegen Java antreten lassen.
Kann mir da jemand mal die nötigen "Befehle" aufschreiben?
Ich schreib mal meinen Code dazu:
#include <cstdlib> #include <iostream> using namespace std; int main(){ int length = 1000; int numbers[length]; for(int i=0; i<length; i++) numbers[i]=rand()%100+1; for(int k=0; k<length-1; k++){ for(int i=0; i<length; i++){ if(numbers[i]>numbers[i+1]){ int hilf = numbers[i]; numbers[i] = numbers[i+1]; numbers[i+1] = hilf; } } } //for(int i=0; i<length; i++) cout << numbers[i] << ", "; cout << endl; system("PAUSE"); return EXIT_SUCCESS; }
-
Bin auch neu hier aber vielleicht kannst du uns noch sagen was du genau für Befehle willst(Zeitmessung etc.).

-
Ja welches "Paket" ich importieren muss.
Und dann brauch ich noch was um die aktuelle Zeit in Millisekunden zu speichern.
Vor und nach dem Sortieren speicher ich dann die Zeit.
Am Ende der Sortierung subtrahiert man einfach die Zeiten voneinander und man erhällt die Laufzeit des Sortiervorganges.Das meinte ich mit "die nötigen 'Befehle' "
Vielen Dank!
-
Die header datei kenn ich glaube ich vielleicht kannst ja ein bisschen googlen dann findest du auch die Befehle dafür!!!
Header:time.h oder ohne .h kann auch sein!!!
-
Ich hab diese Codefragment via Google gefunden:
#include <sys/time.h> int main() { timeval start, end; gettimeofday(&start, 0); ... gettimeofday(&end, 0); cout << start.tv_sec << ':' << start.tv_usec << endl; cout << end.tv_sec << ':' << end.tv_usec << endl; }Allerding gibt mir der Compiler folgenden Fehler aus, den ich wörtlich verstehe, aber aufgrund fehlenden Wissens nicht beseitigen kann:
'gettimeofday' undeclared (first use this function)
Wer mag helfen?
Mein Code sieh so aus:
#include <cstdlib> #include <iostream> #include <sys/time.h> using namespace std; int main(){ timeval start, end; int length = 1000; int numbers[length]; for(int i=0; i<length; i++) numbers[i]=rand()%100+1; gettimeofday(&start, 0); for(int k=0; k<length-1; k++){ for(int i=0; i<length; i++){ if(numbers[i]>numbers[i+1]){ int hilf = numbers[i]; numbers[i] = numbers[i+1]; numbers[i+1] = hilf; } } } gettimeofday(&end, 0); //for(int i=0; i<length; i++) cout << numbers[i] << ", "; //cout << endl; cout << "Start: "<< start.tv_sec << ":" << start.tv_usec << endl; cout << "Ende: " << end.tv_sec << ":" << end.tv_usec << endl; system("PAUSE"); return EXIT_SUCCESS; }
-
Is der gettimeofday vielleicht in einer Klasse untergebraucht?

-
Habe ich keine Ahnung. Gibts da kein schönes Nachschlagewerk wie die Java Api Ref???
-
faleX schrieb:
Habe ich keine Ahnung. Gibts da kein schönes Nachschlagewerk wie die Java Api Ref???
du meinst ne "befehlsliste" zu c++?
-
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrfCplusplusLibraryOverview.asp?frame=true(ctime)
http://www.cppreference.com/
-
edit: 2link: siehe bereits volkards post
-
Ja sowas wie das hier bei Java:
http://java.sun.com/j2se/1.5.0/docs/api/Halt was schönes offizielles an das man sich halten kann.
Wie gesagt habe C++ erst vor 3 Stunden kennengelernt.
Machen das jetzt in der Uni.
-
Kann denn keiner mal über den Code drüber schauen und sagen was falsch ist? Ist doch recht übersichtlich, oder nicht?
ich muss anstatt "gettimeofday(&start, 0)" was anderes schreiben. vlt sowas wie "this.gettimeofday(&start, 0)" oder "time.gettimeofday(&start, 0)" ??!
#include <cstdlib> #include <iostream> #include <sys/time.h> using namespace std; int main(){ timeval start, end; int length = 1000; int numbers[length]; for(int i=0; i<length; i++) numbers[i]=rand()%100+1; gettimeofday(&start, 0); for(int k=0; k<length-1; k++){ for(int i=0; i<length; i++){ if(numbers[i]>numbers[i+1]){ int hilf = numbers[i]; numbers[i] = numbers[i+1]; numbers[i+1] = hilf; } } } gettimeofday(&end, 0); //for(int i=0; i<length; i++) cout << numbers[i] << ", "; //cout << endl; cout << "Start: "<< start.tv_sec << ":" << start.tv_usec << endl; cout << "Ende: " << end.tv_sec << ":" << end.tv_usec << endl; system("PAUSE"); return EXIT_SUCCESS; }
-
versuch' mal, statt der gettimeofday() Aufrufe man: time(3) zu verwenden:
time_t start=time(NULL); //Berechnung time_t ende=time(NULL); cout<<"Start:"<<start<<endl; cout<<"Ende :"<<ende<<endl; cout<<"Diff.:"<<ende-start<<endl;
-
Bei solchen Zeitmessungen läßt sich sehr schön das RAII-Idiom einsetzen. Das heißt "Resource Acquisition Is Initialisation".
Mit dem Anlegen eines lokalen Objektes wird die Zeit gemerkt und im Destruktor des selben Objektes die Dauer bestimmt. Der zu messende Code befindet sich dann im gemeinsamen Code mit dem 'Stopper'-Objekt.
Die Anwendung auf diesen Code sähe in etwa so aus:#include <cstdlib> #include <iostream> #include "Uhr.h" // s.u. int main() { using namespace std; const int length = 1000; int numbers[length]; for(int i=0; i<length; i++) numbers[i]=rand()%100+1; Uhr uhr; { // Scope für Zeit-Stoper Uhr::Stopper stopper( uhr ); for(int k=0; k<length-1; k++){ for(int i=0; i<length; i++){ if(numbers[i]>numbers[i+1]){ int hilf = numbers[i]; numbers[i] = numbers[i+1]; numbers[i+1] = hilf; } } } } // im Destruktor von Stopper wird die Zeit genommen cout << "Dauer: " << uhr << endl; return 0; }Eine (so hoffe ich) standard-konforme Implementierung der Klasse Uhr sähe so aus:
// -- File Uhr.h #include <iostream> #include <time.h> class Uhr { public: struct Stopper { explicit Stopper( Uhr& uhr ) : m_uhr( uhr ) { m_uhr.m_start = clock(); } ~Stopper() { m_uhr.m_dauer = clock() - m_uhr.m_start; } private: Uhr& m_uhr; }; friend struct Stopper; friend std::ostream& operator<<( std::ostream& out, const Uhr& uhr ) { return out << double( uhr.m_dauer ) / double( CLOCKS_PER_SEC ) << 's'; } private: clock_t m_start; clock_t m_dauer; };Gruß
Werner
-
Und sollte time.h nicht funktionieren, nimm ctime.

-
Thx erstmal gleich ausprobieren