Un ptit code pour pikér la vitesse des cpu intel rècents

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 352 fois - Téléchargée 28 fois

Contenu du snippet

pour l'utiliser :

Label1.caption:='Vitesse du cpu : 'Inttostr(get_cpu_speed)+'Mz';

Source / Exemple :


function get_cpu_speed:dword;
{
 voila un chtite functon pour prendre la vitesse
 du cpu qui marche avec un pentium au minimum

 bon coding a vous ...

 ManChesTer (c)2002 freeware
}
var Speed : dword;
begin
 SetpriorityClass(getcurrentprocess,REALTIME_PRIORITY_CLASS);
 SetThreadPriority(getcurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
 asm
   push eax
   push edx
   push ecx
   push 1000
   call sleep      // appel de sleep(1000)
   dw   $310F      // rdtsc (red internal cpu timer in cycle)
   add  eax,edx
   mov  speed,eax  // stokez les cycles machine
   push edx
   xor  eax,eax
   push 1000
   call sleep      // appel de sleep(1000)
   pop  edx
   dw   $310F      // relire le timer cpu rdsc
   add  eax,edx
   sub  eax,speed  // garder 1000 millisecondes (1 seconde)
   mov  speed,eax  // le stocké dans speed;
   pop ecx
   pop edx
   pop  eax
 end;
 result:=round((speed / 1000000) / 3)*3; // div 3 * 3 a cose de busfeq
end;

Conclusion :


Meci fabiin, j'ai updater le code en fait le 1er result etais utile dans ma cpulib mais inutile ici, j'avais oublier de l'enlever. Maintenant c'est fait.

A voir également

Ajouter un commentaire

Commentaires

soumpro
Messages postés
52
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
7 mai 2004

Bon , rien de particulier !
Il faut quand meme pousser un peu plus loin et ce n'est pas à 100% asm !
Enfin !
Scaq
Messages postés
8
Date d'inscription
lundi 7 octobre 2002
Statut
Membre
Dernière intervention
8 janvier 2014

Il y a il me semble une erreur de pile...
ou sleep commence par pop
ton code asm est en 32bits,il est plus rapide de passer les parametre par les registres
Je me trompe peut être!:)
cs_ManChesTer
Messages postés
378
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013

C'est en effet une autre mèthode cam91.
Mais avec ton code, j'ai un plantage liè au fait que tu oublie de sauver les registres, qui bien sur sont modifiès par le call sleep.
Le rèsultat de ta routine est moins prècis (je ne comprend dailleur pas pq).

enfin ton code est un peux "camicase" mais peux convenir dans certains cas.
cs_cam91
Messages postés
19
Date d'inscription
dimanche 9 juin 2002
Statut
Membre
Dernière intervention
4 février 2006

pas mal ton code, je ne connaissais pas le 'call sleep'.
Mais il y à une erreur, dw $310f stock la fréquence sur 64 bits dans edx:eax
(et non pas dans edx+eax). De plus il y a beaucoup de code inutile.
Je ne corrige pas l'erreur, mais je te propose un code plus simple
pour la même fonction qui est exact pour une fréquence <=4 Ghz.
Attention à diviser le résultat par 500000.


function Tform1.get_cpu_speed:dword;
asm
push 1 ;call sleep;dw $310F;mov ecx,eax;
push 500;call sleep;dw $310F;sub eax,ecx
end;
fabiin
Messages postés
338
Date d'inscription
mercredi 4 avril 2001
Statut
Membre
Dernière intervention
8 décembre 2009
6
t'1 cool !!!
ca marche bien en plus :-D

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.