Taktfrequenz der CPU berechnen |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
Diese Routine 'läuft' nur auf der Pentium-Klasse:Die Funktion liest die CPU-Taktfrequenz nicht aus, sondern berechnet sie. Es können deshalb Abweichungen auftreten.
function CalcCPUSpeed: Extended;
const
DelayTime = 500; // measure time in ms
var
TimerHi, TimerLo: DWord;
PriorityClass, Priority: Integer;
begin
try
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread,
THREAD_PRIORITY_TIME_CRITICAL);
try
Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
finally
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
end;
Result := TimerLo / (1000.0 * DelayTime);
except
Result := 0;
end;
end;
Grundlagen: Interrupt List Release 52 von Ralf BrownDie Funktion kann beispielsweise so aufgerufen werden:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := FloatToStr(CalcCPUSpeed);
end;
Dabei wird das Ergebnis nicht gerundet ausgegeben. Um einen glatten Wert zu erhalten, kann dieser mittels 'Round' gerundet werden:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := IntToStr(Round(CalcCPUSpeed));
end;