IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[win32] demande critique de code


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par défaut [win32] demande critique de code
    Bonjour tout le monde,

    je viens d'implémenter rapidement un petit timer. Etant donné que j'ai de grosses lacunes sur tout ce qui concerne l'optimisation et tout ce qui touche à la "haute" précision, je n'ai pas trop confiance en mon code.

    C'est pourquoi j'aimerais avoir votre avis, vos critiques et suggestions afin d'améliorer mon timer.

    Je tiens à préciser que ce timer n'a pas vocation à être portable et ne doit fonctionner que sur Windows XP et ultérieurs.

    Le but de ce timer est de calculer le temps écoulé entre deux points du programme, et ce, le plus précisément possible.

    Voici le code (j'ai mis ensemble la définition et la déclaration de la classe pour simplifier mon post) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    class R_TheTimer
    {
    public:
    	TheTimer()
    	: m_bLastStartSucceeded (false)
    	{
    		LARGE_INTEGER tmp;
    		QueryPerformanceFrequency(&tmp);
    		m_frequency = tmp.QuadPart;
    	}
    
    	~TheTimer(){}
    
    	void Start()
    	{
    		m_bLastStartSucceeded = false;
    		if ( QueryPerformanceCounter( (LARGE_INTEGER *)&m_last ) != 0 )
    			m_bLastStartSucceeded = true;
    	}
    
    	bool Stop(LONGLONG& timeElapsed) //returns false if failed
    	{
    		LARGE_INTEGER newTime;
    		if ( QueryPerformanceCounter( (LARGE_INTEGER *)&newTime) == 0 )
    			return false;
    
    		if ( !m_bLastStartSucceeded )
    			return false;
    
    		LONGLONG newTimeMs = newTime.QuadPart * 10000 / m_frequency;
    		LONGLONG lastTimeMs = m_last.QuadPart * 10000 / m_frequency;
    		timeElapsed = ( newTimeMs - lastTimeMs );
    		return true;
    	}
    
    private:
    	LONGLONG m_frequency;
    	LARGE_INTEGER m_last;
    	bool m_bLastStartSucceeded;
    };
    
    //Un exemple d'utilisation:
    TheTimer the_timer;
    LONGLONG time_elapsed;
    the_timer.Start();
    // traitements
    if ( the_timer.Stop(time_elapsed) )
    {
    	cout << "time elapsed : " << time_elapsed << endl;
    }
    Notes:
    - j'utilise ce code dans un cadre non professionnel.
    - la documentation de la msdn sur les fonctions QueryPerformanceCounter et QueryPerformanceFrequency est ridiculement pauvre.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_frequency = tmp.QuadPart;
    Pourquoi ne pas stocker m_frequency en LARGE_INTEGER ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		m_bLastStartSucceeded = false;
    		if ( QueryPerformanceCounter( (LARGE_INTEGER *)&m_last ) != 0 )
    			m_bLastStartSucceeded = true;
    En d'autres termes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_bLastStartSucceeded = QueryPerformanceCounter(&m_last);
    Et pourquoi diable transtyper des variables pour leur donner le type qu'elles ont déjà ??

    LONGLONG newTimeMs = newTime.QuadPart * 10000 / m_frequency;
    Tu es sûr de ton 10 000 ?
    Ensuite, perso je ferais la division par m_frequency à la fin, histoire de gagner un chouïa en précision.

    Enfin, faire tes tests et des gestions d'erreur à chaque fois est plutôt lourd, à la fois pour toi et l'utilisateur. Tu peux te contenter de tester QueryPerformanceFrequency dans le constructeur --> s'il renvoie vrai c'est que les compteurs de performance sont supportés, et que les appels suivants renverront toujours vrai. Dans le cas où il renvoie faux (ce qui doit être plutôt rare, surtout si tu te limites à XP), tu peux par exemple fournir une version sûre mais moins précise à base de timeGetTime ou GetTickCount().

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Laurent Gomila
    Tu es sûr de ton 10 000 ?
    Bah non, du tout, c'est un bout de code que j'ai récupéré dans la lib wxWidget. En plus, en testant un peu, je me rend compte trés clairement que les valeurs que je retourne ne sont pas des millisecondes. Mais je ne parviens pas à savoir ce que c'est

    Pour le reste, je suis parfaitement d'accord.

  4. #4
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    QueryPerformanceCounter donne un temps en "counts", et QueryPerformanceFrequency te donne le nombre de "counts" par seconde. Donc pour savoir le temps écoulé (en secondes) entre les temps A et B tu fais countB-countA/freq.
    Je reconnais que la doc là-dessus est vraiment pourrie.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par défaut
    Yep merci.
    C'est tout bon.

    Encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Demande de critiques constructives - Code C
    Par Reverse_ dans le forum C
    Réponses: 3
    Dernier message: 10/01/2015, 10h56
  2. WPF, Win32 app, XAML et code-behind?
    Par sacoum dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 27/05/2008, 10h06
  3. Demande d'un code PHP affichant une calendrier
    Par L'aigle de Carthage dans le forum Langage
    Réponses: 5
    Dernier message: 19/04/2008, 19h13
  4. critique du code source de mon programme
    Par startout dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 14/08/2006, 14h18
  5. [WIN32][D7] Rajouter du code RUNTIME
    Par Herk77 dans le forum Delphi
    Réponses: 2
    Dernier message: 09/07/2006, 13h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo