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

C++ Discussion :

Mesurer précisement le temps d'exécution d'une fonction


Sujet :

C++

  1. #1
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut Mesurer précisement le temps d'exécution d'une fonction
    Bonjour,

    Comment mesurer précisement le temps d'exécution d'une fonction en C++ pur. Je cherche une fonction généraliste (pas une fonction de l'API windows).

    Merci d'avance!
    Cordialement,
    Rodrigue
    Rodrigue

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Avec quelle précision ? - sachant que la fonction peut être interrrompue par l'OS qui donne le CPU à un autre thread -

  3. #3
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Bon n'exagérons pas mais la milliseconde serait parfait ...
    Je ne veux pas le centième de millionième de seconde!
    Rodrigue

  4. #4
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu veux un timer précis il faudra de toute façon passer par une fonction de l'OS. Tu peux aussi chercher du côté de RDTSC, il y a un tuto qui en parle ici si je me souviens bien.

  5. #5
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    J'ai regardé du côté de RDTSC mais ça ne m'intéresse pas vraiment ...
    Que puis-je utiliser d'autres alors (même si c'est spécifique windows) ?
    Rodrigue

  6. #6
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Il y'a les apis QueryPerfomanceCounter et GetProcessTimes.

    QueryPerformanceCounter est plus précis je pense.
    L'itération est humaine; la récursion, divine.

  7. #7
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Fiquet
    - FAQ SDL
    - FAQ C++

  8. #8
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Puis-je utiliser time_t ?
    Je me suis fait une petite classe très simple qui me permet de mesurer des temps:
    .h
    .cpp
    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
     
    #ifndef Chrono_H
    #define Chrono_H
     
    #include <time.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/timeb.h>
     
    #pragma once
     
    class Chrono
    {
    public:
        Chrono(void);
        ~Chrono(void);
     
        time_t Start(void);
        time_t Stop(void);
     
        time_t TimeElapsed(void);
     
    private:
        time_t t1, t2;
    };
     
    #endif
    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
    #include "StdAfx.h"
    #include "Chrono.h"
     
    Chrono::Chrono(void)
    {
    }
     
    Chrono::~Chrono(void)
    {
    }
     
    time_t Chrono::Start(void)
    {
        return time(&t1);
    }
     
    time_t Chrono::Stop(void)
    {
        return time(&t2);
    }
     
    time_t Chrono::TimeElapsed(void)
    {
        return (t2 - t1);
    }
    Vous en pensez quoi ?

    Quand je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << chrono->TimeElapsed << std::endl
    , je n'obtiens pas un temps vraiment précis ... Comment faire pour afficher le temps avec plus de précision ?
    Rodrigue

  9. #9
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Oui je sais j'suis con:
    Return the time as seconds elapsed since midnight, January 1, 1970. There is no error return.
    Bon je vais regarder de ce pas du côté des fonctions que vous m'avez filées...
    Rodrigue

  10. #10
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Voilà j'ai trouvé : GetTickCount();
    Le plus simple, le moins de bibli et une précision de ~10 ms. Amplement suffisant... Merci à tous !
    Rodrigue

  11. #11
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    J'ai regardé du côté de RDTSC mais ça ne m'intéresse pas vraiment
    Pourtant...
    http://haypo.developpez.com/article/frequence_cpu/

    Voilà j'ai trouvé : GetTickCount();
    Ce n'est pas vraiment ce qu'il y a de plus précis, QueryPerformanceCounter est meilleur de ce côté là. Mais bon faut voir l'ordre de grandeur de ce que tu veux mesurer, ça évitera qu'on parte dans des solutions ultra-précises si tu n'en as pas besoin.

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

Discussions similaires

  1. Mesurer le temps d'exécution d'une fonction.
    Par Luke spywoker dans le forum Débuter
    Réponses: 3
    Dernier message: 03/02/2015, 10h55
  2. Réponses: 9
    Dernier message: 03/07/2007, 11h44
  3. [VBA-E] Tracer le temps d'exécution d'une fonction
    Par Currahee dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/04/2007, 14h06
  4. mesurer le temps d'exécution d'une fonction
    Par Fonzy007 dans le forum C
    Réponses: 12
    Dernier message: 28/12/2006, 17h27
  5. Réponses: 3
    Dernier message: 11/03/2006, 15h35

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