Benötigte Zeit einer Funktion messen
-
Hallo zusammen,
ich möchte die Zeit messen, die eine Funktion für ihre Ausführung braucht.
soweit nicht sonderlich schwer (-> time.c mit den Funktionen time(&start) und time(&end) ergibt sich die benötigte Zeit als Differenz dieser beiden Werte). Nur scheint meine Funktion relativ schnell zu laufen, sodass sich als benötigte Zeit eine klare 0 ergibt. Wie kann ich auch die kleinsten Milli- oder Nanosekunden in C messen?Danke und Gruß,
Erwin
-
hmm... naja, also ich weiß net, unter welchem OS du arbeitest.
liege ich mit Windows richtig?
da gäbe es einen relativ feinen Timer:LONGLONG freq; bool bTimingEnabled = ( QueryPerformanceFrequency( reinterpret_cast<LARGE_INTEGER *>( &freq ) ) == 0 ); LONGLONG starttime, endtime; if( bTimingEnabled ) { QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER *>( &starttime ) ); } // do sth if( bTimingEnabled ) { QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER *>( &endtime ) ); } // show std::cout << ( endtime - starttime ) / freq << std::endl;alternativ dazu könntest du deinen Code mehrfach ablaufen lassen und dir die Zeit am Anfang und Ende merken und somit auch die Differenz herausbekommen.
-
Bei solchen Geschichten sollte man immer, wenn möglich, den Durchschnitt über eine große Zahl von Aufrufen (z.B. 1 Million oder mehr) nehmen.
-
Vielen Dank für die Hilfe.
Mehrfach (z. B. 100mal) kann ich die Funktion aus Laufzeitgründen nicht ablaufen lassen. Leider handelt es sich um eine sehr rechenintensive Funktion, die bei kleineren Instanzen eine kaum messbare Zeit benötigt, bei sehr großen Instanzen allerdings auch schon einmal im Mehrminuten-Bereich liegt. Und kontrollieren, welcher Fall nun vorliegt, soll eben genau mit dieser Zeitmessung voll-automatisiert werden.
Viele Grüße,
Erwin
-
Du brauchst die Messung also wirklich für die Funktionalität deines Programms und nicht nur aus Interesse. Dann ist eine einfach Messung per QueryPerformaceCounter wohl eine gute Wahl. Es gibt, glaube ich, noch Möglichkeiten, per inline Assembler noch genauer zu messen. Da kenne ich mich aber nicht aus.
-
Messungen in ms lassen sich gut mit GetTickCount() machen... (einfach in Differnz nutzen)
-
Ansonsten einen Profiler rüberjagen (zB gprof) und du bekommst die Laufzeit pro einzelnen Funktionsaufruf angezeigt. Bei der Suche nach Flaschenhälsen sehr praktisch.
-
Zum Thema ganz interessant: http://support.microsoft.com/kb/172338/de
-
Die Messung per QueryPerformaceCounter funktioniert super. Jetzt kann ich vernünftig weiterarbeiten und die Automatisierung starten. Vielen Dank für Eure Hilfe.
-
_matze schrieb:
Du brauchst die Messung also wirklich für die Funktionalität deines Programms und nicht nur aus Interesse. Dann ist eine einfach Messung per QueryPerformaceCounter wohl eine gute Wahl. Es gibt, glaube ich, noch Möglichkeiten, per inline Assembler noch genauer zu messen. Da kenne ich mich aber nicht aus.
Per inline-Assembler ist keine gute Idee, da dir sicher vorschwebt den rdtsc oder sowas zu benutzen, denn bei heutigen Multi-Core-/Multi-CPU-Systemen funktioniert die Zeitmessung nicht mehr so einfach. Bzw. eigentlich ist sie heute noch genau so einfach wie sie es immer war, wenn man die entsprechenden API-Funktionen des BS benutzt.
-
Tippgeber schrieb:
...da dir sicher vorschwebt den rdtsc oder sowas zu benutzen
Genau den meinte ich. Aber gut zu wissen, dass man davon die Finger lassen sollte (was ich sowieso tue).