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
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 :
figer le nom du processeur sous xp [ par rasta76 ]
comment faire pour que le nom situé dans la base de registre processeurnamestringsoit figé c'est à dire que lorsque l'on rentre un nom
Assembleur [ par RM50Man ]
Est ce qu 'il est possible d ajouter du code assembleur ds du code c#RM50man
Thread et charge CPU [ par JuS ]
Voici l'énoncé de mon problème : J'ai un programme client qui communique avec un autre programme serveur. Quand mon client se connecte
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|