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".
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.