| |
|
|
Jac de Lad | Hallo Frank.
Seit einigen Tagen versuche ich folgenden Delphiquelltext für den XPIA umzuschreiben:
function GetCPUSPeed():Longword;stdcall;
var timerhigh,timerlow:dword;
begin
SetPriorityClass(GetCurrentProcess,REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
try
asm
dw 310Fh
mov TimerLow,eax
mov TimerHigh,edx
end;
Sleep(1000);
asm
dw 310Fh
sub eax,TimerLow
sub edx,TimerHigh
mov TimerLow,eax
mov TimerHigh,edx
end;
Result:=Round(TimerLow/1000000);
finally
SetPriorityClass(GetCurrentProcess,NORMAL_PRIORITY_CLASS);
end;
end;
Leider ist bei mir aber nichts rausgekommen. Wenn du oder jemand anderes Lust dazu hat kann er/sie/es den ja mal umschreiben...
Jac
PS: Der Quelltext gibt die aktuelle (nicht die nominale) Frequenz der CPU in MHz zurück. |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 14.05.2007 ▲ |
|
|
|
|
Frank Abbing | Mein Code zur Systemzeitermittlung sieht ähnlich aus, nur eben für alle Prozesse gleichzeitig. Scheint aber nicht überall zu funktionieren. Deinen Code kann ich nicht übersetzen. Weiss z.B. nicht, was TRY ist, oder FINALY. |
|
|
| |
|
|
|
Jac de Lad | Try weist an, dass der folgende Code probiert werden soll und im Fehlerfall an das Ende des Try-Blocks gesprungen wird (ist wie begin...end). Finally weist an, dass auch im Fehlerfall (siehe Try) das aufgeführt werden soll (normalerweise Speicherfreigaben und so). |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 14.05.2007 ▲ |
|
|
|
|
Jac de Lad | Ich habs auch noch nicht geschafft, das übersetzbar zu gestalten. Einige Funktionen müssen sicher invoked werden...ist wie gesagt Delphi. Aber der Code ist sicher, also hat mir immer richtige Ergebnisse geliefert.
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 14.05.2007 ▲ |
|
|
|
|
Frank Abbing | dw 310Fh
Ein Integerwert? Wofür ist der, oder ist das nur ein Abstandhalter?
mov TimerLow,eax mov TimerHigh,edx
Hm, woher kommen denn die Werte in den Registern EAX und EDX? Zumindest EDX ist mir unklar. |
|
|
| |
|
|
|
Jac de Lad | Du überfragst mein Wissen. Der Quellcode wurde nicht von mir entwickelt. Ich hatte ihn nur bei einem befreundeten Programmierer erhalten, als ich genau das gebraucht habe. Tut mir leid, ich dachte, du kannst da was zaubern... |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 14.05.2007 ▲ |
|
|
|
|
Michael Wodrich | $310f ist ein hartcodierter: RDTSC mittels CoDec ermittelt; den Code gibts ab Pentium CPUs - aber mir bekannte Assembler übersetzen den nicht.
Schöne Grüße Michael Wodrich
P.S.: Google ist zum RDTSC sehr auskunftsfreudig... |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 14.05.2007 ▲ |
|
|
|
|
Jac de Lad | In Delphi gehts. Ich würde ja gern ne DLL hochladen, aber ich kann jetzt keine erzeugen, da ich Delphi nicht installiert habe. Ich hab auch schon alle Datenträger verpackt, weil ich umziehe (zieht sich noch bis Ende des Monats). Aber die Funktion steckt auch in Parcival. |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 14.05.2007 ▲ |
|
|
|
|
Frank Abbing | @Micheal: MASM32 kennt den Befehl sehr wohl. Nur musst du umstellen auf Pentiumcode.
@Jac: Verrückt, der Code funktioniert ja wirklich! KompilierenMarkierenSeparieren {$cleq}
Declare x&
Cls
Print Ermittle Frequenz der CPU...
AsmStart CPUSpeed
.686p
invoke GetCurrentProcess
invoke SetPriorityClass,eax,REALTIME_PRIORITY_CLASS
invoke GetCurrentThread
invoke SetThreadPriority,eax,THREAD_PRIORITY_TIME_CRITICAL;
rdtsc
push eax
invoke Sleep,1000
rdtsc
pop ebx
sub eax,ebx
xor edx,edx
mov esi,1000000
div esi
push eax
invoke GetCurrentProcess
invoke SetPriorityClass,eax,NORMAL_PRIORITY_CLASS
pop eax
AsmEnd(x&)
Print ...+Str$(x&)+ MHz.
WaitInput
End
|
|
|
| |
|
|
|
Jac de Lad | Kannste ja mit als Beispiel aufnehmen! |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 15.05.2007 ▲ |
|
|
|
|
Frank Abbing | Ja, muss es bei Gelegenheit aber nochmal anpassen für den 64 Bit Wert. Deine Code benutzt auch nur den Lowwert, also nur 32 Bit (Result:=Round(TimerLow/1000000)). Deswegen könnte der ermittelte Wert auf einigen Maschinen fehlerhaft sein. Und mein Code entsprich deinem. |
|
|
| |
|
|
|
Jac de Lad | Hm, auf allen Rechnern, wo ich das bisher getestet habe (auch der Benchmark von Parcival) lief der Code einwandfrei. Vielleicht kannste das ja noch ändern, dass der ein Double zurückliefert, für genauere Ergebnisse. Freut mich, dass ich was brauchbares posten konnte. |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 16.05.2007 ▲ |
|
|
|