Lösung : Prozessorspeed in MHZ
-
@kingruedi
ok ich habs zum laufen gebracht. erhalte aber auch
unterschiedliche werte... und viel zu hoch...hast du das problem mitlerweile geloest?
-
nö, ich hab mich nicht dran gesetzt. Weiss nicht genau woran es liegt.
-
Könnte man mit dem Code auch messen, wie lange die CPU für einen Befehl braucht, z.b. für ein xor ax,ax oder so?
Ich hab´s mal versucht und das Sleep dagegen ersetzt, aber hab immer nur 11 rausgekriegt, egal was ich statt xor eingesetzt habe, auch bei 30 xor kommt noch 11 raus.#include <iostream> #include <windows.h> #include <conio.h> using namespace std; DWORD GetMHZ() { DWORD value1 = 0; DWORD value2 = 0; DWORD value3 = 0; DWORD value4 = 0; __asm { rdtsc mov value1, eax mov value2, edx } __asm { xor ax,ax xor ax,ax xor ax,ax xor ax,ax } __asm { rdtsc mov value3, eax mov value4, edx } value1 = value3 - value1; value2 = value4 - value2; double MHZ = (value1+(value2*(2^32))); return (DWORD)MHZ; } int main() { cout << (int)GetMHZ() << " Ticks"<<endl; cout << (int)GetMHZ() << " Ticks"<<endl; cout << (int)GetMHZ() << " Ticks"<<endl; cout << (int)GetMHZ() << " Ticks"<<endl; getch(); return 0; }
Wieso kommt mir da immer 11 raus?
mfg und thx im Voraus
Noob
-
Hallo Leute,
Der Thread ist schon etwas älter, aber ich habe ein Problem mit diesem Code:
Ich bekomme ca alle 2 bis 4 Sekunden in value4 einen Wert, der um 1 zu groß ist, bzw in value 2 einen, der um 1 zu klein ist.
Da die Differenz dieser beiden Zahlen bei der Berechnung mit 2 hoch 32 malgenommen wird (hab diese Stelle in meinem code berichtigt), hat das natürlich ziemliche auswirkungen ...
Ich dachte erst, das liegt daran, dass Sleep zu ungenau ist, deswegen hab ich mir mit QueryPerformanceFrequency und QueryPerformanceCounter ne eigene Sleep-Funktion gebastelt. Brachte aber keine Besserung. Jemand ne Idee, woran das liegen könnte und wie ich es beheben kann?
Und hat jemand ne Ahnung, was QueryPerformanceFrequency ausliest und ob ich das anstelle dieses Codes irgendwie verwenden kann? Das kann nicht das gleiche sein, da der Wert sehr viel kleiner ist ...
Danke
-
Niemand ne Idee?
-
Mich wundert, dass diese CPU-Speed-messung so ueberhaupt funktionieren soll... Die Interrupts bleiben schliesslich aktiviert, dadurch wird IMHO das Ergebnis verfaelscht
-
wenn ich schreibe:
;vergangene millisekunden messen
mov ecx,10000
loop__:
db 90 dup(10000)
dec ecx
jnz loop__:
;nochmal millisekunden messendamit kriege ich doch die ungefähre zeit raus die die CPU für 100MHZ(wenn ihc mich nicht verrechnet habe) raus oder?
Damit könnte man die geschwindigkeit auf die echte Rechenleistung hoch rechnen.
-
So wie ich das sehe, wuerde diese Prozedur zwischen den beiden Messpunkten ziemlich lange dauern... Da kannst Du dir sicher sein, dass Windows in der Zwischenzeit ein paar Interrupts abhandelt und schon ist das Ergebnis unbrauchbar.
-
Original erstellt von Bigor:
damit kriege ich doch die ungefähre zeit raus die die CPU für 100MHZ(wenn ihc mich nicht verrechnet habe) raus oder?
Damit könnte man die geschwindigkeit auf die echte Rechenleistung hoch rechnen.Jein, nicht wenn dein Prozessor parallelisiert und z.B. drei NOPs gelichzetig ausführt
-
unter Windows,aber unter DOS denke ich würde es gehen.
-
Original erstellt von Bigor:
unter Windows,aber unter DOS denke ich würde es gehen.Eine Drei-Pipeline-CPU ist ein drei-Pipeline-CPU und führt so gut es geht drei Befehle parallel aus, ob Windows, DOS, Linux oder sonstiges
-
wie kann es sein, dass das ueberhaupt funktioniert hat? 2^32 ist doch 34, oder? haben das alle verbessert die hier ergebnisse gepostet haben, oder was ist los?
um die ticks von genau einer sekunde zu kommen, koennte man die zeit, die fuer Sleep(1000) benoetigt wird messen, und davon die fuer Sleep(0) abziehen. dann muesste ja der overhead fehlen.
hat ein prozessor echt nicht irgendwas, was man direkt auslesen kann, um auf die mhz zu kommen?
-
Original erstellt von PeterTheMaster:
um die ticks von genau einer sekunde zu kommen, koennte man die zeit, die fuer Sleep(1000) benoetigt wird messen, und davon die fuer Sleep(0) abziehen. dann muesste ja der overhead fehlen.Sleep wartet zufällig lange, je nach dem, welche anderen Prozesse leben.
Hattu keine hochauflösende Uhr, dann mach so:
-mit while(clock()==t) auf nen clocktickbeginn warten (oder andere genaue uhr)
-Sleep(lange);
-mit while(clock()==t) auf nen clocktickbeginn warten (oder andere genaue uhr)
So haste ne genaue Zeitdifferenz. Dat rult.aber warum nicht einfach ungefähr ne sekunde sleepen, davor und danach sowohl mit rdtsc als auch QueryPerformanceCounter messen.
und dann kommt...
obwohl genügend ******* sagen, ohne mathe könne man proggen...
der gewaltigen DREISATZ!!!und schwups habe ich fertig.
[ Dieser Beitrag wurde am 16.11.2002 um 12:42 Uhr von volkard editiert. ]
-
Original erstellt von PeterTheMaster:
wie kann es sein, dass das ueberhaupt funktioniert hat? 2^32 ist doch 34, oder? haben das alle verbessert die hier ergebnisse gepostet haben, oder was ist los?Ähm...2+32=34, ich weiß ja nicht wie man dir Potenzrechnung beigebracht hat, aber bei mir ist 2^32 = 4294967296 != 34.
Um nochmach volkard zu Zitieren
"obwohl genügend ******* sagen, ohne mathe könne man proggen..."
-
2^32==34
-
Original erstellt von Mr. N:
2^32==342^32 != 34
-
Das kommt darauf an,
#define ^ +
mfg
-bg-
-
Ist das die Standarddefinition von ^ ?
-
2^32 == 34
2³² != 34Meint ihr PeterTheMaster ist dumm? Der hat schon recht.
-
Original erstellt von -bg-:
**Das kommt darauf an,#define ^ +
mfg
-bg-**kannst in c++ nur bezeichner definen. also zeichenkette aus buchstaben, unterstrich und ziffern. sogar c++-schlüsselwürter gehen, das der präprozessor ja noch c++-blind ist.
aber auch ganz ohne definen, muß ich wirklich bestätigen, daß 2^32==34.