Mesures en haute precision (win32)

1/5 (8 avis)

Vue 4 067 fois - Téléchargée 402 fois

Description

DLL (3 Ko) qui fournit 3 calculs en haute resolution:
- vitesse processeur en Mghz.
- mesure en ticks processeur.
- mesure en millisecondes.
Ultra simple d'utilisation.
suffit de coller bnPrecis.lib dans dossier du projet
et d'inclure bnPrecis.h dans le module qui s'en sert.

Source / Exemple :


#include <windows.h>
#include "resource.h"
#include "bnPrecis.h"

DWORD res;
char szbuff[24];

DWORD __stdcall PerdreTemps(DWORD init, DWORD count)
{
  double d = 0.5;
  while(count) {
    init += count;
    d += (((double) d) / 3.5);
    count--;
  }
  return (init + (DWORD) d);
}

BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_INITDIALOG:
      SetClassLong(hdlg, GCL_HICON, (long)LoadIcon(0, (LPCTSTR)IDI_APPLICATION));
      // affichage de la vitesse CPU
      SetDlgItemInt(hdlg, IDST_SPEEDPROC, bnCpuSpeedMghz(), 0);
      return 1;
    case WM_COMMAND:
      switch(wParam) {
        case IDBT_TICKS:
          bnTicksStart(); // INITIALISATION DES TICKS PROCESSEUR
          res = PerdreTemps(8, 0xFFFF); // proc a mesurer en ticks
          // recuperation des TICKS UTILISES par PerdreTemps()
          _ui64toa(bnTicksResult(), szbuff, 10);
          SetDlgItemText(hdlg, IDST_TICKS, szbuff);
          return 0;
        case IDBT_MILLI:
          bnMilliscndStart(); // INITIALISATION DES MILLISECONDES
          res = PerdreTemps(8, 0xFFFF); // proc a mesurer en millisecondes
          // recuperation des MILLISECONDES UTILISEES par PerdreTemps()
          _ui64toa(bnMilliscndResult(), szbuff, 10);
          SetDlgItemText(hdlg, IDST_MILLI, szbuff);
          return 0;
        case IDCANCEL: EndDialog(hdlg, 0);
      }
  }
  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
  // TEST qui suit est FORTEMENT RECOMMANDE !!!
  // DLL dira si timer haute resolution est disponible
  // NE PAS FAIRE DE MESURES si bnPrecisionOK() retourne ZERO, sinon crash !!!
  if(bnPrecisionOK()) 
    DialogBoxParam(hInstance, (LPCTSTR)IDD_APP, 0, AppDlgProc, 0);
  return 0;
}

Conclusion :


zip contient tout le projet format VS 2003.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
16 févr. 2007 à 10:57
dis Brunews, t'es toujours embetté...
que tu postes chaque source sur chacun des sites CS (Asm et Cpp, quoi ^^) selon leur langage, ou que tu regroupe tout dans le même zip, certains trouvent toujours a redire...

++
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 févr. 2007 à 10:30
Dire nimporte quoi a donc plus sa place ici ???
Faut-il aussi supprimer les sources qui utilisent DirectX, OpenGL, Sdl, etc etc au prétexte qu'on en a pas les sources ?
Je suppose donc que tu n'as jamais employé sprintf() ni aucune lib dont on n'a pas les sources avec le compilo.
verdy_p Messages postés 202 Date d'inscription vendredi 27 janvier 2006 Statut Membre Dernière intervention 29 janvier 2019
16 févr. 2007 à 01:33
Je motive ma demlande de supprimer ce code, car ce qu'est sensé faire la librairie c'est d'accéder à des registres spéciaux internes du processeur, qui peuvent même être réservés. Ce type de code sera nécessairement dépendant du type de processeur utilisé (rien n'indique qu'il sera portable ou ne rendra pas des résultats faux, ni que le type de processeur est correctement testé; de plus la détetion exacte du type de processeur nécessite des instructions privilégiées, et ce genre de librairie va donc tenter d'élever ses privilèges, ce qui constitue un risque élevé de sécurité, car cela se passe sans autorisation explicite de l'utilisateur!)

Réellement, pour mesurer le temps de façon précise, il y a des APIs Windows officielles qui permettent d'accéder de façon portable aux "compteurs de précision" supportés par Windows et mis à sa disposition par le pilote spécifique du processeur installé, ou par d'autres périphériques externes pouvant fournir des horloges encore plus précises.

Si on veut passer outre Windows et ses pilotes de processeur, il faut écrire du code assembleur qui va détecter le type de processeur et lire les registres de compteurs de temps de précision, ou à défaut, qui va effectuer une mesure empirique de boucle basée sur des profils de processeurs connus (mais rien ne dit que la mesure empirique obtenue fonctionnera sur toutes les générations de processeurs).

Ce code, de plus, est incapable d'estimer la précision de la mesure puisque, a priori, il tourne en tant que thread d'un processus, et que la mesure va être influencée par les processus et threads concurrents et l'activité générale du système. Pour que la mesure soit fiable, il faut mesurer des indicateurs de qualité, notamment avec plusieurs mesures non correllées et le calcul d'un écart type suffisant pour estimer la précision. C'est comme pour un sondage: il faut une population minimale dans l'échantillon de mesures pour estimer la précision du pourcentage de votes!

Bref, ce code est totalement à éviter, car il n'est pas possible d'en mesurer la sécurité, ni la fiabilité, ni la compatibilité.
verdy_p Messages postés 202 Date d'inscription vendredi 27 janvier 2006 Statut Membre Dernière intervention 29 janvier 2019
16 févr. 2007 à 01:22
Ce code devrait être suppimé de la liste.

Ce n'est en effet pas du tout un code source mais juste un exemple d'utilisation (très basique car la partie sourcée ne contient rien au sujet de la mesure que ce programme est sensé faire, mais juste un squelette vide très générique similaire à une appli HELLO World de base) d'une librairie propriétaire (bnPrecis.lib avec bnPrecis.h) sans aucun source.

STRONG DELETE NOW. Ca n'a rien à faire ici!!!
nicolas66 Messages postés 116 Date d'inscription mercredi 25 décembre 2002 Statut Membre Dernière intervention 4 janvier 2009
5 avril 2006 à 00:04
Ca serait possible que tu files le code du programme en entier stp ca m'intéresserait beaucoup :p

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.