Icono
"Calcular la velocidad del procesador"

 
 



En esta sección de Código fuente en Delphi vamos a mostrar cómo podemos conocer la velocidad del procesador de la máquina donde se ejecuta nuestro programa.

Para ello, he escrito esta pequeña app de ejemplo.

Existen muchas formas distintas de conseguir esta tarea en Delphi. Aquí traigo dos métodos diferentes para calcular la velocidad del microprocesador de un PC.

Las dos funciones expuestas en el código siguiente son: GetCPUSpeed1 y GetCPUSpeed2

En ambos casos nos devuelven la velicidad del procesador en Mhz, pero con la diferencia de que GetCPUSpeed1 devuelve una valor tipo "Comp" (real) mientras que GetCPUSpeed2 devuelve un valor tipo "DWord" (entero).

Para poder mostrar estos valores por pantalla debemos convertirlos a cadenas con las funciones FloatToStr e IntToStr respectivamente

Los resultados de ambas funciones no son completamente identicos, pero se aproximan mucho a la velocidad real del procesador, puedes hacer pruebas para ver cual de las dos funciones devuelve un resultado más preciso en tu equipo.

En la aplicación de ejemplo simplemente se muestran en dos etiquetas (TLabel) los resultados de ambas funciones y como podemos ver en la imagen son ligeramente diferentes.

En la siguiente imagen puedes ver un ejemplo de uso de esta app.

A continuación, puedes ver el código completo de la app, y si lo deseas puedes descargarlo todo (código y app) en un archivo "zip".

Unit1.pas
unit Unit1;



interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetCPUSpeed2: Dword; //Devuelve velocidad del procesador en Mhz. Ejemplo 2000 Mhz
const
  DelayTime = 500; // measure time in ms
var
  TimerHi, TimerLo: DWORD;
  PriorityClass, Priority: Integer;
begin
  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 div (1000 * DelayTime);
end;



function GetCpuSpeed1: Comp; //Devuelve velocidad del procesador en Mhz. Ejemplo 2000 Mhz
var
  t: DWORD;
  mhi, mlo, nhi, nlo: DWORD;
  t0, t1, chi, clo, shr32: Comp;
begin
  shr32 := 65536;
  shr32 := shr32 * 65536;

  t := GetTickCount;
  while t = GetTickCount do begin end;
  asm
     DB 0FH
     DB 031H
     mov mhi,edx
     mov mlo,eax
  end;

  while GetTickCount < (t + 1000) do begin end;
  asm
     DB 0FH
     DB 031H
     mov nhi,edx
     mov nlo,eax
  end;

  chi := mhi;
  if mhi < 0 then chi := chi + shr32;

  clo := mlo;
  if mlo < 0 then clo := clo + shr32;

  t0 := chi * shr32 + clo;

  chi := nhi;
  if nhi < 0 then chi := chi + shr32;

  clo := nlo;
  if nlo < 0 then clo := clo + shr32;

  t1 := chi * shr32 + clo;

  Result := (t1 - t0) / 1E6;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption := '1º) La velocidad de este procesador es de ' + floattostr(GetCPUSpeed1) + ' Mhz';
  Label2.Caption := '2º) La velocidad de este procesador es de ' + inttostr(GetCPUSpeed2) + ' Mhz';
end;

end.
Puede descargar el código fuente anterior con este enlace:
codigo-fuente-getcpuspeed.zip
Puede encontrar una versión Portable de Delphi en esta dirección:
http://www.andyaska.com/?act=download&id=34&mode=detail
 
Delphi Source Code
Velocidad del Procesador



Descargar Velocidad del Procesador Windows 10 Compatible



Mapa del sitio
logo-MecaNet
Certificado de seguridad del sitio













© Carlos Miguel Cáceres García