Stoppuhr
-
Hallo Leute!
Mit was benutzt ihr um nachzusehen will schnell die Funktionen laufen?
Das Problem ist ja, dass der Rechner eh alles umheimlich schnell ausrechnet so bräucht ich wahrscheinlich etwas was kleiner ist als die Millisekundenuhr? Oder kann man einzelne Takten im Prozessor nachzählen?Könnt ihr den Quellcode direkt hier reinkopieren wenn möglich?
hätt gern etwa so:
Starten; // Stoppuhr starten ... // hier kommen meine Testscripte wie schnell sie laufen Stoppen; // Stoppuhr stoppen und ergebnis in MS-Console liefern
ich habn AMD 1,4 GHz
-
Hi,
ich benutze Betriebssystemabhängige Funktionen.
Hier meine Timer für Windows://global LARGE_INTEGER lnTimerOld; LARGE_INTEGER lnTimerFreq; //Timer starten (Zählstand merken) void StartTimer() { QueryPerformanceCounter(&lnTimerOld); QueryPerformanceFrequency(&lnTimerFreq); } //Timerdifferenz abfragen (in ms) DWORD GetTimer() { LARGE_INTEGER lnTimerNew; QueryPerformanceCounter(&lnTimerNew); LARGE_INTEGER diff; diff.QuadPart = (lnTimerNew.QuadPart - lnTimerOld.QuadPart); diff.QuadPart /= lnTimerFreq.QuadPart/1000.0; return diff.QuadPart; }
Ist in Millisekunden, wenn du´s noch genauer brauchst, nimm die 1000.0 raus.
Das Problem bei kleinen Zeitmessungen ist ja, das der Overhead durch den Funktionsaufruf immer deutlicher wird.
Deshalb lieber:
Timer starten, Zählstand merken
Funktion mehrmals, z.B. 1000 mal ausführen
Timer ablesen
Timer berechnenPlattformübergreifend ist dir die Funktion clock vielleicht lieber.
-
da ich leider nur Console kenne.
Kann ich also einfach #include <windows.h>dann deine Zeilen einkopieren?
mit StartTimer(); starte ich es?
mit GetTimer(); kann ich die Zahl rausholen? was ist DWORD eigentlich für ein Typ?
hab mal mit
cout << GetTimer() << endl;
versucht
kommt aber immer nur 0 raus?übergreifend wär mir schon lieber, wie geht das?
-
windows.h kannst du auch für Consolen benutzen, null Problemo. Die Win32-API funktioniert ja schliesslich immer, egal ob Console oder Fenster.
Wenns plattformunabhängig sein soll, solltest du Boost-Library benutzen.
http://www.boost.org/doc/html/date_time.html
Schau dir mal darin die Posix-Time an. Da bekommste im idealfall nanosekunden raus.
Können aber die PCs glaub ich nicht... aber Millisekunden reicht ja auch!
Aber day_clock scheint auch nützlich zu sein.
Habe die Klassen jedoch noch nie benutzt. Boost benutze ich schon, nur hab ich bisher noch nicht alles gebraucht.
-
auf x86-pc's geht auch das hier: http://www.math.uwaterloo.ca/~jamuir/rdtscpm1.pdf
-
net! Der war gut!
übergreifend wär mir schon lieber, wie geht das?
Und du gibst ihm ein Doc wo er inline-Assembler Schnippsel zu sehen bekommt.
-
Auf POSIX-Systemen wie z.B. Linux würdest du das im Zweifel mit clock_gettime machen. Das dürfte so oder so eher machen, was du willst - du willst ja wissen, wieviel CPU-Zeit die Funktion verbraucht, nicht, wie lange das Ausführen der Funktion gedauert hat.
Für genauere Info, schau am besten in die manpage.
-
Artchi schrieb:
net! Der war gut!
übergreifend wär mir schon lieber, wie geht das?
was hast du? rdtsc ist betriebssystem-übergreifend (weil das os völlig egal ist). in der hinsicht ist es besser als 'QueryPerformanceCounter', was ja nur unter win geht. rdtsc funzt im kernel- und user-mode gleichermassen.
-
Und wie soll ich das bitte auf einem ARM-Prozessor benutzen??? Wie soll ich das auf einem PowerPC-Prozessor benutzen??? Das PDF ist ja wohl nur für x86-Prozessoren und kompatible gültig, oder nicht?
Schön und gut das es OS-unabhängig ist, aber er hat nicht gesagt, das ihm OS-unabhängig reicht?
Die Boost-Lib gibts dagegen auf mehreren Systemen. Die Boost-Lib gibts immerhin auch für MIPS-, PowerPC- und Sparc-Rechner.