RÉCUPÉRER LA FRÉQUENCE DU PROCESSEUR

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 10 juin 2004 à 09:42
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005 - 10 déc. 2007 à 20:18
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/23561-recuperer-la-frequence-du-processeur

Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
10 déc. 2007 à 20:18
Content de l'entendre :)

Sinon désolé pour les mises à jour multiples, et j'ai également oublié de retirer un fichier qui n'a rien à voir (FileDecrypt.cs).
piradom Messages postés 16 Date d'inscription dimanche 2 juillet 2006 Statut Membre Dernière intervention 15 juillet 2008
10 déc. 2007 à 20:03
Au fait je suis sous vista, et je vient d'essayer avec l'ajout du nouveau code,
eh bien sa marche parfaitement:)
piradom Messages postés 16 Date d'inscription dimanche 2 juillet 2006 Statut Membre Dernière intervention 15 juillet 2008
10 déc. 2007 à 19:58
Ok, donc j'attends que tu fasse la mise a jour

Merci!!!
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
10 déc. 2007 à 19:51
Enfait je viens de me rendre compte que j'avais mis à jour mon code sans envoyer la version mise à jour sur ce site, ce que je vais faire de suite.
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
10 déc. 2007 à 19:46
Salut,

Quelle version et édition de Windows utilises tu? (XP/Vista, 32/64 bit)
Si c'est Vista ou XP 64, l'erreur doit venir du fait que la mémoire allouée par AllocHGlobal ne possède pas le droit d'exécution.

Pour corriger cela, il fait ajouter un appel à VirtualProtect avant l'appel à CreateThread:

//ajoute le droit d'exécution à la page de mémoire allouée
int oldProtect;

VirtualProtect( hCode, new IntPtr( code.Length ), PAGE_EXECUTE_READWRITE, out oldProtect );

//crée un thread qui va exécuter la fonction ASM
hThread = CreateThread( IntPtr.Zero,
...

//constante et déclaration de VirtualProtect
private const int PAGE_EXECUTE_READWRITE = 0x40;

[DllImport("Kernel32.dll")]
private static extern void VirtualProtect( IntPtr adress, IntPtr size, int newProtect, out int oldProtect );
piradom Messages postés 16 Date d'inscription dimanche 2 juillet 2006 Statut Membre Dernière intervention 15 juillet 2008
10 déc. 2007 à 15:10
Salut,

lorsque je lance l'execution de ce code sous "Visual Studio 2008", l'application bug en tentant d'obtenir la frequence du CPU;

Si quelqu'un a une idée sa serait sympa, Merci!
georgeduke Messages postés 167 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 13 avril 2007
7 août 2005 à 11:05
Ton source est vraiment sympa car il n'y a pas beaucoup d'exemples (en français) de l'implémentation d'asm dans C# !! (au fait je t'ai envoyé un message privé à ce propos)
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
20 juin 2004 à 18:50
L'idée c'est que ca marche sans DLL, juste en ajoutant un fichier source au projet. Sinon, j'aurai pu faire une dll avec mon code asm et la charger avec DllImport.
Sinon pour le stackframe l'ASM est en encore nouveau pour moi alors que le stackframe soit nécessaire ou pas je sais pas trop.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 16:02
ça je peux vous le faire en 2 minutes, suffit de demander.
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
20 juin 2004 à 16:00
Si tu veux te servir du code de BruNews tu le compile sous forme d'une dll qui exporte les methodes et tu t'en sert via les DllImport non ?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 15:53
Le mien ne prenant que 28 octets sur la pile pour un tres court instant, devrait plus etre necessaire stackframe, enfin c'est toi qui voit.
Je m'en retourne au code natif, vraiment trop le bord... a mon gout ces codes interpretes.
Bossez bien.
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
20 juin 2004 à 15:43
Pour ton code je vais pas pouvoir l'utiliser directement puisqu'il se lie statiquement aux QueryPerfX, ce qui n'est pas possible avec un assembly .NET. (C'est pour ca que dans mon code l'appellant utilise LoadLibrary/GetProcAddress et passe comme paramètre l'adresse de QueryPerformanceCounter)

Sinon je pense que la stackframe est utile si tu regardes tout l'espace que le code alloue sur la stack:

//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)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 15:19
'retranscrire' n'est surement pas le bon terme, juste voir comment tu peux t'en servir dans ton C#, moi aucune idee.
Au fait, pourquoi tu fais une stackframe:
push ebp
mov ebp, esp
c'est utile ici ?
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
20 juin 2004 à 15:11
Quand tu dis retranscrire, tu veux bien dire convertir le code ASM en:

private static byte[] GetCpuFrequencyCode()
{
byte[] code = new byte[147];
//push ebp
code[ 0] = 0x55;
//mov ebp, esp
code[ 1] = 0x8B; code[ 2] = 0xEC;
//;alloue la pile locale
//sub esp, 64
...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 12:27
Xya > regarde si tu peux retranscrire l'ASM de:
http://www.cppfrance.com/code.aspx?ID=23837
va bon pour tous processeurs, teste jusqu'au bixeon 3.06 impec.
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 juin 2004 à 16:28
le code marche niquel
on a toujours des 0.001 mais bon ça doit etre normal
faudrais que je me documente un peu pour savoir comment fonctionne ce fameux ht
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
10 juin 2004 à 14:49
Voilà, j'ai modifié mon code pour pouvoir spécifier l'ID du processeur sur un système multiprocesseur, mais comme je n'ai pas de processeur HyperThreading sous la main je n'ai pas pu faire de tests.


Xya
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 juin 2004 à 09:42
Et hop en favoris, l'idée de la mesure me plait bien, merci

Il semble juste qu'il y ai un petit probleme avec les procs HyperThreading (et potentiellement multiproc donc), dans mon cas il donne souvent la valeur 0,001 sur le test de 1s (l'utilisation du test 1ms semble resoudre le probleme)

Comme solution alternative on peut utiliser le WMI et sa classe Win32_Processor (espace root/cimv2)
propriétés CurrentClockSpeed/MaxClockSpeed (unité = Mhz)
Rejoignez-nous