Accueil > > > RÉCUPÉRER LA FRÉQUENCE DU PROCESSEUR
RÉCUPÉRER LA FRÉQUENCE DU PROCESSEUR
Information sur la source
Description
Cette source classique permet de récupérer une valeur approchée de la fréquence de son processeur. Comme je n'en ai pas vu pour C#/.NET, je l'ai adapté en C#. Cette implémentation alloue de la mémoire non managée pour y écrire un bout de code en assembleur, puis l'exécute en créant un thread dont le point d'entrée est l'adresse de la mémoire contenant le code asm.
Source
- public struct CpuFreqParams
- {
- //addresse de QueryPerformanceCounter
- public IntPtr lpQPCounterAddress;
- //temps à attendre pendant le test
- public long testSpan;
- //nombre de cycles passés pendant le test
- public long nCycles;
- }
-
- //code asm utilisé. un peu plus long que la plupart de codes de ce genre
- //à cause de l'addition/soustraction d'entiers 64 bits (avec add/adc et sub/sbb)
- //et de la structure utilisée pour les paramètres, pour être lancé comme thread
- __declspec(naked) void __stdcall GetCPUFrequency( LPVOID lpParams )
- {
- //Pile locale:
- //
- //UINT64 endCycle (ebp-68 et ebp-64)
- //UINT64 startCycle (ebp-60 et ebp-56)
- //UINT64 tickCurrent (ebp-52 et ebp-48)
- //UINT64 tickEnd (ebp-44 et ebp-40)
- //UINT64 tickStart (ebp-36 et ebp-32)
- //DWORD lpQPCounterAddress (ebp-28)
- //UINT64 testSpan (ebp-20 et ebp-16)
- //UINT64 nCycles (ebp-12 et ebp-8)
- __asm
- {
- push ebp
- mov ebp, esp
- ;alloue la pile locale
- sub esp, 64
- ;sauvegarde les registres et les flags
- push eax
- push ecx
- push edx
- push esi
- push edi
- pushfd
- ;vérifie que lpParams n'est pas null
- cmp dword ptr [ebp+8], 0
- je clear
- ;copie les paramètres dans la pile
- mov esi, dword ptr [ebp+8]
- lea edi, dword ptr [ebp-28]
- mov ecx, 24
- cld
- rep movsb
- ;vérifie que lpQPCounterAddress n'est pas null
- cmp dword ptr [ebp-28], 0
- je clear
- ;obtient le nombre de ticks avec QueryPerfCounter
- lea ecx, dword ptr [ebp-36]
- push ecx
- call dword ptr [ebp-28]
- ;ajoute testSpan au nombre ticks pour avoir l'"heure" en ticks à attendre
- mov ecx, dword ptr [ebp-36]
- add ecx, dword ptr [ebp-20]
- mov dword ptr [ebp-44], ecx
- mov ecx, dword ptr [ebp-32]
- adc ecx, dword ptr [ebp-16]
- mov dword ptr [ebp-40], ecx
- ;obtient le nombre de cycles du processeur
- rdtsc
- mov dword ptr [ebp-60], eax
- mov dword ptr [ebp-56], edx
- ;boucle d'attente
- L1:
- ;obtient le nombre de ticks avec QueryPerfCounter
- lea ecx, dword ptr [ebp-52]
- push ecx
- call dword ptr [ebp-28]
- ;regarde si on doit sortir de la boucle
- lea esi, dword ptr [ebp-44]
- lea edi, dword ptr [ebp-52]
- mov ecx, 2
- cld
- rep cmpsd
- jae L1
- ;obtient le nombre final de cycles du processeur
- rdtsc
- mov dword ptr [ebp-68], eax
- mov dword ptr [ebp-64], edx
- ;obtient le nombre de cycles passés pendant le test
- mov ecx, dword ptr [ebp-68]
- sub ecx, dword ptr [ebp-60]
- mov dword ptr [ebp-12], ecx
- mov ecx, dword ptr [ebp-64]
- sbb ecx, dword ptr [ebp-56]
- mov dword ptr [ebp-8], ecx
- ;copie la pile vers les paramètres
- lea esi, dword ptr [ebp-28]
- mov edi, dword ptr [ebp+8]
- mov ecx, 24
- cld
- rep movsb
- clear:
- popfd
- pop edi
- pop esi
- pop edx
- pop ecx
- pop eax
- add esp, 64
- mov esp, ebp
- pop ebp
- ret
- }
- }
public struct CpuFreqParams
{
//addresse de QueryPerformanceCounter
public IntPtr lpQPCounterAddress;
//temps à attendre pendant le test
public long testSpan;
//nombre de cycles passés pendant le test
public long nCycles;
}
//code asm utilisé. un peu plus long que la plupart de codes de ce genre
//à cause de l'addition/soustraction d'entiers 64 bits (avec add/adc et sub/sbb)
//et de la structure utilisée pour les paramètres, pour être lancé comme thread
__declspec(naked) void __stdcall GetCPUFrequency( LPVOID lpParams )
{
//Pile locale:
//
//UINT64 endCycle (ebp-68 et ebp-64)
//UINT64 startCycle (ebp-60 et ebp-56)
//UINT64 tickCurrent (ebp-52 et ebp-48)
//UINT64 tickEnd (ebp-44 et ebp-40)
//UINT64 tickStart (ebp-36 et ebp-32)
//DWORD lpQPCounterAddress (ebp-28)
//UINT64 testSpan (ebp-20 et ebp-16)
//UINT64 nCycles (ebp-12 et ebp-8)
__asm
{
push ebp
mov ebp, esp
;alloue la pile locale
sub esp, 64
;sauvegarde les registres et les flags
push eax
push ecx
push edx
push esi
push edi
pushfd
;vérifie que lpParams n'est pas null
cmp dword ptr [ebp+8], 0
je clear
;copie les paramètres dans la pile
mov esi, dword ptr [ebp+8]
lea edi, dword ptr [ebp-28]
mov ecx, 24
cld
rep movsb
;vérifie que lpQPCounterAddress n'est pas null
cmp dword ptr [ebp-28], 0
je clear
;obtient le nombre de ticks avec QueryPerfCounter
lea ecx, dword ptr [ebp-36]
push ecx
call dword ptr [ebp-28]
;ajoute testSpan au nombre ticks pour avoir l'"heure" en ticks à attendre
mov ecx, dword ptr [ebp-36]
add ecx, dword ptr [ebp-20]
mov dword ptr [ebp-44], ecx
mov ecx, dword ptr [ebp-32]
adc ecx, dword ptr [ebp-16]
mov dword ptr [ebp-40], ecx
;obtient le nombre de cycles du processeur
rdtsc
mov dword ptr [ebp-60], eax
mov dword ptr [ebp-56], edx
;boucle d'attente
L1:
;obtient le nombre de ticks avec QueryPerfCounter
lea ecx, dword ptr [ebp-52]
push ecx
call dword ptr [ebp-28]
;regarde si on doit sortir de la boucle
lea esi, dword ptr [ebp-44]
lea edi, dword ptr [ebp-52]
mov ecx, 2
cld
rep cmpsd
jae L1
;obtient le nombre final de cycles du processeur
rdtsc
mov dword ptr [ebp-68], eax
mov dword ptr [ebp-64], edx
;obtient le nombre de cycles passés pendant le test
mov ecx, dword ptr [ebp-68]
sub ecx, dword ptr [ebp-60]
mov dword ptr [ebp-12], ecx
mov ecx, dword ptr [ebp-64]
sbb ecx, dword ptr [ebp-56]
mov dword ptr [ebp-8], ecx
;copie la pile vers les paramètres
lea esi, dword ptr [ebp-28]
mov edi, dword ptr [ebp+8]
mov ecx, 24
cld
rep movsb
clear:
popfd
pop edi
pop esi
pop edx
pop ecx
pop eax
add esp, 64
mov esp, ebp
pop ebp
ret
}
}
Conclusion
Ce code devrait marcher pour tous les processeurs à partir du Pentium, et sur toutes les versions de Windows à partir de 2000 (à cause de l'appel à VirtualProtect). Le test effectué est sur un AMD 2400+ (2.0 Ghz) sous Windows XP. Pour les systèmes multiprocesseurs/multicore/HyperThreading, le test peut échouer s'il est trop long (ex: 1 sec), une durée de 10 ms ou moins devrait réussir dans la plupart des cas.
Historique
- 10 décembre 2007 20:06:11 :
- - Correction d'un bug de protection de mémoire avec Vista et les éditions 64 bit de Windows
- Encapsulation du code nécessaire pour exécuter du code assembleur dans une classe (RunAsm), utilisée par la classe CpuFrequency
- 10 décembre 2007 20:09:37 :
- Corrigé un bug de protection de mémoire qui causait une erreur avec Vista et les versions 64 bit de Windows. Encapsulé le code nécessaire pour exécuter du code assembleur dans une classe (RunAsm), qui peut être utilisée indépendamment de la classe CpuFrequency, mais qui est utilisée par celle-ci.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Frequence de processeur [ par Zakki49 ]
Bonjour à tous, j'ai urgemment besoin de votre aide, voila je developpe une petite appli affichant la frequence du processeur en temps réel. Et je ve
Mon sous-programme ne répond pas lors de l'appel [ par LilBisk ]
Tout est dans le titre :( Le sous-programme en question : [code=cs] /* Il renvoie la valeur de la frequence choisie par une entreprise à partir de l
wmi not supported.! CPU Temp [ par pl4hs ]
bonjour a tous, je viens a vous suite à un problème dans un de mes projets. Prez rapide : [code=autre]Je réalise un soft qui permet au PC overcloc
Remplir un comboBox par une Arraylist [ par LoubnaML ]
Bonjour je suis besoin d'une méthode qui remplir le comboBox par une Arrayliste j'ai crée ma propre méthode : class ClassProcesseur { pr
Taux d'utilisation du processeur par coeurs dans une appli multi-threads [ par desperados27 ]
Bonjour, J'espère poster dans le bon thème ! Je pose une question par curiosité sur la charge processeur dans une appli. Je ne trouve pas de réponse
Infos Bios et CPU [ par Lille59 ]
Question pour un champion... Comment faire pour récupérer les infos du Bios et du processeur dans une API ???<b
instruction c# pour CPU [ par rerereda ]
Bonjour,je voudrais savoir s'il existe une instruction spécifique que je pourrais introduire dans mon "main.cs" pour mesurer la charge CPU de mon PC a
[C#] pre-processeur & TreeViewCheckBox [ par scoubidou944 ]
1°) Tout développeur C++ se souvient de#ifdef _DEBUG#else#endifMaintenant, sous Visual C# .NET, _DEBUG n'existe plus, C koi alors l'expression pour di
Processeur [ par gregomtl ]
Salut tout le monde...Comment fait on pour savoir quel % du processeur est utilise par un programme [ex. programme TOTO.exe] ?Merci a tous !
utilisation cpu par processus [ par Adidas2 ]
Salut tous le mondeJe cherche à obtenir l'utilisation CPU de chaque processus lancé quelqu'un aurait une idée de la fonction à utiliser svp ?Langage :
|
Derniers Blogs
[TECHDAYS2012] OUI J'Y SERAI![TECHDAYS2012] OUI J'Y SERAI! par JeremyJeanson
Bonsoir, Certes, je l'annonce avec un peu de retard, mais je serai effectivement au Techdays demain. Comme l'an dernier, je participerai au programme ATE (Ask The Expert). Si vous avez des questions Workflow, WCF, AppFabric ou plus généralement .net, n'hé...
Cliquez pour lire la suite de l'article par JeremyJeanson TFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICESTFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICES par vfabing
Afin de s'assurer du bon fonctionnement des différentes synchronisations effectuées par les TFS Integration Tools, 2 rapports sont présents dès l'installation. Il suffit alors d'effectuer les manipulations suivantes pour pouvoir les visualiser : Loca...
Cliquez pour lire la suite de l'article par vfabing CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|