begin process at 2010 09 06 12:55:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date / Heure

 > UNE CLASSE DE CHRONO QUI VA JUSQU'A LA NANOSECONDE !

UNE CLASSE DE CHRONO QUI VA JUSQU'A LA NANOSECONDE !


 Information sur la source

Note :
8,5 / 10 - par 8 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Date / Heure Classé sous :chrono, queryperformancecounter, chronomètre, horloge, tests Niveau :Débutant Date de création :17/09/2005 Date de mise à jour :28/03/2006 14:36:53 Vu :15 981

Auteur : nightlord666

Ecrire un message privé
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

Cette source sert à calculer le temps necessaire pour executer du code. Il y a plusieurs précisions possibles : la milliseconde, la microseconde et la nanoseconde. La source n'est pas de moi : elle vient d'un livre (très bien fait) sur la programmation objet C++ (Le langage C++ de Marius VASILIU).


Source

  • //CPerfChrono.h
  • //Classe PerfChrono qui permet de mesurer le temps necessaire pour effectuer une portion de code
  • #include <windows.h> //Pour les fonctions QueryPerformanceCounter et QueryPerformanceFrequency
  • #define Ms 1000
  • #define Us 1000000
  • #define Ns 1000000000
  • class PerfChrono
  • {
  • __int64 freq, t0; //la frequence de l'horloge et le temps initial
  • public:
  • PerfChrono() //Le constructeur qui va récupérer la fréquence de l'horloge
  • {
  • QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
  • //On passe en paramètre à QueryPerformanceFrequency une structure LARGE_INTEGER qui est composée d'un __int64
  • //Cette structure(içi freq) va contenir la frequence de l'horloge
  • }
  • void Start()
  • {
  • QueryPerformanceCounter((LARGE_INTEGER*)&t0);
  • //On fait pareil qu'au dessus mais cette fois t0 va contenir le temps au debut du chronometrage
  • }
  • DWORD GetDiffMs()
  • {
  • __int64 t1; //le temps au moment de l'execution de la fonction
  • QueryPerformanceCounter((LARGE_INTEGER*)&t1); //On assigne à t1 le temp au moment de l'execution de la fonction
  • return (DWORD)(((t1 - t0) * 1000) / freq); //La forumle qui permet de calculer le temps écoulé
  • //Pour avoir le temps écoulé, on retranche le temps au moment de la fonction du temps au debut du chrono,
  • //Puis on le multiplie par la précision (1000) et on le divise par la frequence.
  • }
  • DWORD GetDiffUs() //Us pour µs
  • {
  • __int64 t1; //le temps au moment de l'execution de la fonction
  • QueryPerformanceCounter((LARGE_INTEGER*)&t1); //On assigne à t1 le temp au moment de l'execution de la fonction
  • return (DWORD)(((t1 - t0) * 1000000) / freq); //La forumle qui permet de calculer le temps écoulé
  • //Pour avoir le temps écoulé, on retranche le temps au moment de la fonction du temps au debut du chrono,
  • //Puis on le multiplie par la précision (1000000) et on le divise par la frequence.
  • }
  • DWORD GetDiffNs()
  • {
  • __int64 t1; //le temps au moment de l'execution de la fonction
  • QueryPerformanceCounter((LARGE_INTEGER*)&t1); //On assigne à t1 le temp au moment de l'execution de la fonction
  • return (DWORD)(((t1 - t0) * 1000000000) / freq); //La forumle qui permet de calculer le temps écoulé
  • //Pour avoir le temps écoulé, on retranche le temps au moment de la fonction du temps au debut du chrono,
  • //Puis on le multiplie par la précision (1000000000) et on le divise par la frequence.
  • }
  • DWORD GetDiff(UINT unit)
  • {
  • __int64 t1;
  • QueryPerformanceCounter((LARGE_INTEGER*)&t1);
  • return (DWORD)(((t1 - t0) * unit) / freq);
  • }
  • DWORD GetFreq()
  • {
  • return (DWORD)freq;
  • }
  • };
  • /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  • //Test.cpp
  • //Test de la classe de chrono
  • #include "CPerfChrono.h"
  • #include <iostream>
  • using namespace std;
  • int main(int argc, char *argv[], char *envp[])
  • {
  • PerfChrono chrono;
  • cout<<"Frequence de l'horloge : "<<chrono.GetFreq()<<" Hz."<<endl;
  • cout<<"Testons la précision de cette horloge :"<<endl;
  • cout<<"10 millisecondes = ";
  • chrono.Start();
  • Sleep(10);
  • cout<<chrono.GetDiffNs()<<endl;
  • return 0;
  • }
//CPerfChrono.h
//Classe PerfChrono qui permet de mesurer le temps necessaire pour effectuer une portion de code

#include <windows.h> //Pour les fonctions QueryPerformanceCounter et QueryPerformanceFrequency

#define Ms 1000
#define Us 1000000
#define Ns 1000000000

class PerfChrono
{
    __int64 freq, t0; //la frequence de l'horloge et le temps initial

public:
    PerfChrono() //Le constructeur qui va récupérer la fréquence de l'horloge
    {
        QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
        //On passe en paramètre à QueryPerformanceFrequency une structure LARGE_INTEGER qui est composée d'un __int64
        //Cette structure(içi freq) va contenir la frequence de l'horloge
    }

    void Start()
    {
        QueryPerformanceCounter((LARGE_INTEGER*)&t0);
        //On fait pareil qu'au dessus mais cette fois t0 va contenir le temps au debut du chronometrage
    }

    DWORD GetDiffMs()
    {
        __int64 t1; //le temps au moment de l'execution de la fonction
        QueryPerformanceCounter((LARGE_INTEGER*)&t1); //On assigne à t1 le temp au moment de l'execution de la fonction
        return (DWORD)(((t1 - t0) * 1000) / freq); //La forumle qui permet de calculer le temps écoulé
        //Pour avoir le temps écoulé, on retranche le temps au moment de la fonction du temps au debut du chrono, 
        //Puis on le multiplie par la précision (1000) et on le divise par la frequence.
    }

    DWORD GetDiffUs() //Us pour µs
    {
        __int64 t1; //le temps au moment de l'execution de la fonction
        QueryPerformanceCounter((LARGE_INTEGER*)&t1); //On assigne à t1 le temp au moment de l'execution de la fonction
        return (DWORD)(((t1 - t0) * 1000000) / freq); //La forumle qui permet de calculer le temps écoulé
        //Pour avoir le temps écoulé, on retranche le temps au moment de la fonction du temps au debut du chrono, 
        //Puis on le multiplie par la précision (1000000) et on le divise par la frequence.
    }

    DWORD GetDiffNs()
    {
        __int64 t1; //le temps au moment de l'execution de la fonction
        QueryPerformanceCounter((LARGE_INTEGER*)&t1); //On assigne à t1 le temp au moment de l'execution de la fonction
        return (DWORD)(((t1 - t0) * 1000000000) / freq); //La forumle qui permet de calculer le temps écoulé
        //Pour avoir le temps écoulé, on retranche le temps au moment de la fonction du temps au debut du chrono, 
        //Puis on le multiplie par la précision (1000000000) et on le divise par la frequence.
    }

    DWORD GetDiff(UINT unit)
    {
        __int64 t1;
        QueryPerformanceCounter((LARGE_INTEGER*)&t1);
        return (DWORD)(((t1 - t0) * unit) / freq);
    }

    DWORD GetFreq()
    {
        return (DWORD)freq;
    }
};

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//Test.cpp
//Test de la classe de chrono

#include "CPerfChrono.h"
#include <iostream>

using namespace std;

int main(int argc, char *argv[], char *envp[])
{
    PerfChrono chrono;
    cout<<"Frequence de l'horloge : "<<chrono.GetFreq()<<" Hz."<<endl;
    cout<<"Testons la précision de cette horloge :"<<endl;
    cout<<"10 millisecondes = ";
    chrono.Start();
    Sleep(10);
    cout<<chrono.GetDiffNs()<<endl;
    return 0;
}

 Conclusion

Si vous me mettez une mauvaise note, expliquez moi pourquoi svp.
Si vous trouvez un bug (ou une amélioration à faire), signalez le moi svp je mettrais ma source a jour dans les deux jours qui suivent.


 Historique

17 septembre 2005 12:20:11 :
Correction des fautes d'orthographe
18 septembre 2005 16:27:53 :
Recorrection de l'orthographe à la suite du commentaire de Urgo
02 novembre 2005 15:47:16 :
Rajout du zero de la ligne 46
28 mars 2006 14:36:54 :
Ajout de la fonction `GetDiff` permettant de choisir l'unité.

 Sources de la même categorie

Source avec Zip CLASSE DE DATE LOCALISÉE (20 LANGUES) par exar
Source avec Zip CLASSE MOMENT V2.0 par le_duche
CALCUL DATE DE PAQUES (DATE MOBILE) par steph12358
Source avec une capture VACCATION (AVEC FONCTION) CONSOLERIE, REMIX GCC par sebman
Source avec Zip Source avec une capture AFFICHER ET DIRE L'HEURE (REPONSE FORUM) par ndubien

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CHRONOMÈTRE OSD (WIN32) par racpp
Source avec Zip Source avec une capture HORLOGE NUMÉRIQUE EN SDL par Dorn17
Source avec Zip Source avec une capture SE RENDRE COMPTE DU TEMPS PASSE DEVANT SON ORDINATEUR : UN C... par rzomalala
Source avec Zip LIBRAIRIE CONTENANT UNE TRENTAINE D'ALGORITHMES DE TRI par xkamen
Source avec Zip TIMER par tibur

Commentaires et avis

Commentaire de dominion le 18/09/2005 00:56:35

J'ai entendu dire que la nanoseconde ne peut être calculée que par des ordis nouvelle génération (P4 ou XP+)... Est-ce vrai ???

Commentaire de Urgo le 18/09/2005 15:52:56

Le langage (sans "u" en français), svp!

Commentaire de nightlord666 le 18/09/2005 16:26:55

dominion &#9658; Je ne sais pas mais moi ça marche sur ma carte mère toute pourrie alors ça devrait marcher sur ton ordi. Essaie le programme et comme ça tu es sur.

Urgo &#9658; Merci, je vais corriger ça dès aujourd'hui.

Commentaire de dominion le 19/09/2005 01:27:18

nightlord666 << Le prog marche, ok... Mais moi je parlais de la précision du calcul... Tu vois un chiffre mais d'après ce qu'on m'a dit la précision du dit chiffre dépend de la carte mère (ce qui paraît logique). Je voulais juste confirmation ;-)

Commentaire de bweps le 19/09/2005 14:52:10

salut, je vais être lourd, mais ça ne vous dérange pas que votre mesure prenne aussi en compte le temps d'exécution de toutes les applis qui tournent en même temps, alorss que vous cherchez une précision si grande ?

Commentaire de bweps le 19/09/2005 14:55:38

J'ai fait une classe qui permet de ne mesurer le temps que d'un processus, mais apparemment personne n'en voit l'intérêt... Si vous voulez voir,
http://www.cppfrance.com/codes/UNE-CLASSE-SIMPLE-EN-C-POUR-MESURER-LE-TEMPS-D-EXECUTION-D-UNE-PORTION-DE-CODE-SUR-UNE-MACHINE-NON-DEDIEE-AUX-TESTS-WINDOWS-/33788.aspx

Commentaire de nightlord666 le 20/09/2005 18:57:40

bweps -> Bah j'ai testé et avec 23 processus lancés, j'arrive à une précision à 10 nanosecondes près...

dominion -> Je ne sais pas, le meilleur moyen est de regarder à l'execution du programme la ligne : "10 millisecondes = xxx nanosecondes". Comme ca tu voit bien la précision : plus la valeur xxx s'approche de 10000, plus c'est précis.

Commentaire de vangeurmasker le 24/10/2005 15:09:08

Deux petits commentaires
- 1 seconde = 10e9 nanosecondes => 10 millisecondes = 10 000 000 nanosecondes
- la fonction sleep ne permet en aucun cas de faire une pose précise.

Sinon cette source est bien hormis la faute ligne 46 il manque un zero

Commentaire de ordepedro le 22/01/2006 12:17:15

Merci pour ton code nightlord666, il va m'être bien utile.
Sinon petite question: Pourquoi ne pas remplacer les 3 fonction GetDiff... par une seule du genre ?

#define mS 1000
#define uS 1000000
#define nS 1000000000

DWORD GetDiff(UINT Unite)   //'Unite' prenant les valeure mS uS ou nS
{
    __int64 t1;
    QueryPerformanceCounter((LARGE_INTEGER*)&t1);
    return (DWORD)(((t1 - t0) * Unite) / freq);
}

Est ce que c'ette écriture influe sur le résultat ou sur la rapidité du code ?

Commentaire de Ndisalvio le 16/02/2006 13:23:22

En fait je pense que c'est le temps d'executer la classe qui fait que le temps trouve est légèrement supérieur à 10ms (en Ns bien shur)

Commentaire de nightlord666 le 28/03/2006 14:28:58

--> Ordepedro

Ca ne doit pas influer beaucoup(une mise de valeur dans la pile) donc c'est une bonne idée. Je vais rajouter ça dans la classe.

Commentaire de nightlord666 le 28/03/2006 14:39:53

Si ça intéresse quelqu'un, je vais peut-être refaire une version de la classe en assembleur pour la rendre plus rapide à l'éxécution. Dès que je l'aurais finie, je la posterai sur asmfr.com.

Commentaire de BruNews le 28/03/2006 15:27:36 administrateur CS

Un appel system + 1 multiplication et 1 division
Tu penses gagner quoi en ASM ?

Commentaire de Zyph0s le 02/07/2006 16:45:01

Ce code ne marche pas sur un processeur Multi-core. Sauf si on le force sur un seul core. Quelqu'un a une solution ?

Commentaire de Zyph0s le 02/07/2006 17:03:25

Voici la solution, empêcher le changement de core du thread. Comme expliqué ici:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/Game_Timing_and_Multicore_Processors.asp

Il suffit de forcer le thread sur un CPU, ici sur le premier CPU en ne donnant l'affinité qu'à un seul processeur, ici le premier
SetThreadAffinityMask(GetCurrentThread(),1);

plus d'info sur :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setthreadaffinitymask.asp

Commentaire de themadmax le 28/03/2007 16:23:37

Supposition d'amelioration :

class PerfChrono
{
///la frequence de l'horloge
__int64 m_freq;
///Temp initial
__int64 m_t0;
public:
enum Unit { ms, micros, nanos };
PerfChrono(void);
~PerfChrono(void);
void start(void);
DWORD getDiff(Unit unit = ms);
};

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Je cherche des anim pour faire des tests... urgent [ par tazkeum ] Hello,Savez-vous où je peux trouver des anim et autres décor (2d) pour tester mes prg d'animation sous Direct X (le format est peu important, je le co Horloge [ par djamine ] Bonjour a tout le mondeje suis entrain de faire un programme trés anncien en Cc'est d'afficher l'heure comme ça (hh.mn.sc) quand les secondes atteindr Modifier l'horloge de Windows [ par ggoufa ] Salut à tous,est ce que quelqu'un sait comment modifier l'heure de windows ?? Je pensais le faire un SetSystemTime. Qu'en pensez vous ?Merci à vousFab QueryPerformanceCounter [ par Xentor609 ] Salut,Quelqu'un peut-il me dire a quoi correspond exactement la valeur retournée par QueryPerformanceCounter?Bye,Xentor609 Controler le port série et l'horloge du pc [ par Melusyne ] Bonjour !!! @ tous !!! Je suis actuellement en DUT Génie des télécoms & réseaux et je suis désespérée. Je dois faire un programme pour contrôle Heure avec centième de seconde [ par heyhi ] Engros j'aurais besoin de fair un truc qui ressemblerait à ca :1)Je lance mon chrono2)J'execute d'autre instruction3)J'arrete mon chrono pour le lireL Chronomètre fous! [ par malik7934 ] Je chronomètre une de mes fonctions et je me suis rendu compte d'un truc étrange: alors que je fais systématiquement les mêmes calculs d'une fois à l' cercle, horloge, static POINT xxxx [ par ultima666 ] Bonjour je voulais savoir si l'on pouvait trcer des cercle avec la même méthode que ca:void ( HDC hdc, xxxxx){static BOOL alpha [2][3] = { 1,0,1,1, Chrono VC++ [ par imothepe_33 ] J'aimerais savoir s'il n'y a pas un controle en VC++ se comportant comme un chrono. Merci&nbsp; comment créer un horloge en C ?! [ par starjab ] &nbsp;je d&#233;bute et j'ai commenc&#233; &#224; cr&#233;er une horloge en C ..qu'en pensez vous??!!#include &lt;iostream&gt;#include &lt;stdlib.h&gt


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales