wie groß ist die Zahl die bei der QueryPerformaceFrequence funktion zurückgegeben wird
-
Hallo,
gemeint ist natürlich das Argument der Funktion und nicht der BOOL Rückgabewert.
ich bastle grade an einer timer class mit hilfe eines Buches.
Ich möchte erst mal nur wissen ob und wie schnell meine Frequence in der Hardware implementiert ist... dazu folgender code:char buf [256]; if (QueryPerformanceFrequency((LARGE_INTEGER*)&countsPerSecond) == 0) { MessageBox(mainhWnd, _T("No PerformanceCounter hardware found."), _T("ERROR"), MB_OK); return 0; } else { sprintf(buf,"%I64d",countsPerSecond); MessageBoxA(mainhWnd,buf , ("ERROR"), MB_OK); return 0; }
im Buch habe ich gelesen das die Hardware des counters mit 3.19 MHz arbeitet bzw. kennen die Autoren keinen andere Hardware.
Das bedeutet also das ich eine Zahl um die 3 200 000 erwarten kann - in meiner messageBox bekomme ich aber die Zahl 3 391 610 000 ausgegeben, also 3 Nullen zu viel.
Weiß jemand wie diese Zahl entsteht?
Ist es ein Druckfehler und es sollte GHz heißen oder muss ich mir die letzten 3 Nullen wegdenken oder verwende ich den falschen Datentyp oder alles zusammen???P.S. : wenn ich bei der Funktion "sprintf" "%i" übergebe dann habe ich eine negative Zahl was darauf hindeutet das sie überläuft, also größer als
2 147 483 647 ist. Das wiederum erhärtet den Verdacht, das es sich um einen Druckfehler handelt.
Gebe ich nähmlich "%u" ein (Wertbereich 0 - 4 294 967 295) bekomme ich wieder die Zahl 3 391 610 000 raus. Alles spricht für einen Druckfehler - wenn es aber einer ist bedeutet es aber auch das ich eine unglaublich kleine Zeit messen kann - unrealistisch.Kann mir also jemand diesen Sachverhalt erklären?
Danke im Voraus
-
wenn die frequenz immer und überall gleich wäre, bräuchte man die funktion nicht.
dass die autoren keine andere hardware kennen, spielt keine rolle. du solltest davon ausgehen, dass dir die funktion nahezu beliebige werte zurückliefern kann.
-
Die Funktionen QueryPerformanceFrequency() und QueryPerformanceCounter() gibts schon seit Win95.
Die Hard- und Software wird aber in großen Schritten weiterentwickelt.
Grob gesagt: Die damaligen Versionen nahmen ein Timer (z.b. der legendäre 8250) als Taktgeber, später kam der schnellere Videotaktgeber mit höherer Frequenz hinzu.Ab einer bestimmten Pentium-Baureihe (ich denke mal ab Pentium II oder III, ich weiß es nicht mehr so genau) wird die (in dieser Baureihe neu eingeführte) "RealTimeCounter" RDTSC-Instruktion verwendet, der (normalerweise) mit dem Prozessortakt versorgt wird
Somit ist Deine Zahl 3 391 610 000 (also 3.4GHz) wahrscheinlich in etwa die Taktfrequenz Deines Prozessors.
Und das was die Buchautoren meinten, war wohl ein Timer-Taktgeber mit 3.19MHz in der Vor-Pentium II (bzw. III)-Ära.Ganz wichtig: Zur zuverlässigen (Langzeit-)Zeitmessung oder gar Taktfrequenzmessung ist QueryPerformanceFrequency/Timer NICHT geeignet, da viele moderne Multicore-CPUs in den verschiedenen Stromspartechniken ihren Takt permanent rauf und runterfahren.
Siehe auch http://msdn2.microsoft.com/en-us/library/bb173458.aspxHTH,
Martin
-
nein ich ich möchte die frequence zur Grafikausgabe benutzen.
wenn es also 3.4GHz sind - könnte ich ich ja 0,000 000 003 sek genau messen.
Brauch ich zwar nicht aber intressant ist es trotzdem - das ist ja im NANOsekunden Bereich.
-
?!