La Web del Programador: Comunidad de Programadores
 
    Pregunta:  18978 - COMO AVERIGUO LA VELOCIDAD DEL PROCESADOR?
Autor:  Carlos Jaramillo
Por favor me dicen con qué comando puedo averiguar la velocidad del procesador de un equipo con Windows ME sin necesidad de entrar por el set up?
Gracias.

  Respuesta:  claudio romero
Hola aca va el fuente en Delphi, perdon por los nombres de las variables.
Se basa en la instruccion de los procesadores Pentium y superiores RDTSC (Read Time Stamp Counter) o algo asi. Esta instruccion devuelve en los registros EDX:EAX un nro de 64 bits que representa la cantidad de ciclos de procesador ejecutado.
En un Pentium 300, seran 300.000.000 millones ciclos por segundo, asi que solo mido el tiempo inicial y el final para sacar la diferencia.
No tengo ahora el EXE compilado si lo quieres te lo envio.

procedure TForm1.Button1Click(Sender: TObject);
var HI_Inicio,LO_Inicio,C:dword;cantidad:real;
begin
asm
db $0F, $31 // opcode para RDTSC
mov HI_inicio,edx
mov LO_inicio,eax
end;
Sleep(500);
asm
db $0F, $31 // opcode para RDTSC
sub eax,lo_inicio
jnc @no_carry
dec edx
@no_carry:
sub edx,hi_inicio
mov ecx,1000 // en eax cuantos miles de ciclos pasaron en medio seg.
div ecx //edx:eax / ecx
mov C,eax
end;
cantidad:=C;
cantidad:=(cantidad / 1000)*2;
button1.caption:=floattostr(cantidad);
end;

  Respuesta:  claudio romero
Hola aca va el fuente en Delphi, perdon por los nombres de las variables.
Se basa en la instruccion de los procesadores Pentium y superiores RDTSC (Read Time Stamp Counter) o algo asi. Esta instruccion devuelve en los registros EDX:EAX un nro de 64 bits que representa la cantidad de ciclos de procesador ejecutado.
En un Pentium 300, seran 300.000.000 millones ciclos por segundo, asi que solo mido el tiempo inicial y el final para sacar la diferencia.
No tengo ahora el EXE compilado si lo quieres te lo envio.

procedure TForm1.Button1Click(Sender: TObject);
var HI_Inicio,LO_Inicio,C:dword;cantidad:real;
begin
asm
db $0F, $31 // opcode para RDTSC
mov HI_inicio,edx
mov LO_inicio,eax
end;
Sleep(500);
asm
db $0F, $31 // opcode para RDTSC
sub eax,lo_inicio
jnc @no_carry
dec edx
@no_carry:
sub edx,hi_inicio
mov ecx,1000 // en eax cuantos miles de ciclos pasaron en medio seg.
div ecx //edx:eax / ecx
mov C,eax
end;
cantidad:=C;
cantidad:=(cantidad / 1000)*2;
button1.caption:=floattostr(cantidad);
end;