DruckenMister WongFacebook

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;