CPU-Speed messen (nicht auslesen)
uses
SysUtils, Windows;
function CalcCPUSpeed: Extended;
const
DelayTime = 500;
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);
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;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo / (1000.0 * DelayTime);
except
Result := 0;
end;
end;
2 Hinweise seien gegeben: auf ganz alten CPUs (386er?) läuft das ned; und der andere: als Funktionswert wird ein Wert vom Typ Extended zurückgegeben. Dies ist ein extrem hoher Wertebereich mit Nachkommastellen. Um ihn ordentlich nutzen zu können, solltet ihr ihn formatieren - z.B. so:
a := FormatFloat('0',CalcCPUSpeed);
Writeln(a);
Hier eine kleine Konsolen-Anwendung als Beispiel:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
var
a: String;
function CalcCPUSpeed: Extended;
const
DelayTime = 500;
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);
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;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo / (1000.0 * DelayTime);
except
Result := 0;
end;
end;
begin
Writeln('Realwert: ',CalcCPUSpeed);
Writeln;
Writeln('Erste Art der Darstellung:');
a := FormatFloat('0',CalcCPUSpeed);
Writeln(a,' MHz');
Writeln;
Writeln('Zweite Art der Darstellung:');
a := FormatFloat('0,',CalcCPUSpeed);
Writeln(a,' MHz');
Writeln;
Writeln('Dritte Art der Darstellung (im Code):');
a := FormatFloat('0," MHz"',CalcCPUSpeed);
Writeln(a);
Readln;
end.