Home » Tipps & Tricks » System » Hardware » Taktfrequenz der CPU berechnen

Taktfrequenz der CPU berechnen

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 Brown. Die 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;