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 :

Calcul du temps d'exécution avec une grande précision en c++


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut Calcul du temps d'exécution avec une grande précision en c++
    Salut à tous,

    Je réalise un programme en C++ sous windows 7 sur visual studio 2010 dans lequel j'ai besoin de calculer le temps d'éxécution avec une grande précision ( en millisecondes).

    J'ai trouvé une façon de faire qui est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        #include <ctime>
        ...
        temps_initial = clock ();
        . . .
                         /* Partie du code à évaluer */
        . . .
        temps_final = clock ();
        temps_cpu = (temps_final - temps_initial) / CLOCKS_PER_SEC * 1000; // millisecondes
    mais qui ne donne pas le temps exact pour des petites instances; et en faisant l'exécution plusieurs fois du meme code il ne donne pas le meme temps .
    Quelqu'un saurait-il s'il existe une autre manière en C++ de calculer le temps avec uen grande précision ?
    Merci d'avance de votre réponse.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Joe,

    J'utilise QueryPerformanceCounter.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Citation Envoyé par mathro Voir le message
    mais qui ne donne pas le temps exact pour des petites instances; et en faisant l'exécution plusieurs fois du meme code il ne donne pas le meme temps .
    Quelqu'un saurait-il s'il existe une autre manière en C++ de calculer le temps avec uen grande précision ?
    Je vais pas répondre à la question, mais j'ai une ou deux remarques...

    Que le temps d'exécution ne soit pas parfaitement identique si tu lances plusieurs fois ton application, c'est normal

    En conséquence, vouloir améliorer la précision des compteurs n'est pas forcement possible

    Tu veux faire quoi exactement ?

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    QueryPerformanceCounter + QueryPerformanceFrequency si on veut afficher une durée en s.
    Mais quoi qu'il arrive, que l'on ait des temps différents est normal, il y a tant de choses qui se passent sans cesse sur une machine...

    Généralement, pour faire des benchs, je répète un grand nombre de fois l'opération à mesurer, jusqu'à ce que le temps total soit visible à l’œil nu (quelques secondes au moins).

    En suite, je répète toutes mes mesures deux fois, et si je n'ai pas des valeurs suffisamment proches, je recommence tout, éventuellement en modifiant ce que je mesure.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Je vais pas répondre à la question, mais j'ai une ou deux remarques...

    En conséquence, vouloir améliorer la précision des compteurs n'est pas forcement possible

    Tu veux faire quoi exactement ?
    Mon application s'exécute en 0.56 s mais le programme m'affice dès fois 3s des fois 4s des fois 2s je veux qu'il m'affiche 0:00:00.56

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    C'est vrai que ça fait beaucoup de variation. Mais le problème vient pas du compteur et encore moins de sa précision. Voir ton code, faire du profiling, etc

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    C'est vrai que ça fait beaucoup de variation. Mais le problème vient pas du compteur et encore moins de sa précision. Voir ton code, faire du profiling, etc
    Ou tout simplement la machine.
    Lancement d'un autre logiciel, scan d'un fichier, ...... pendant l'exécution.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Ou tout simplement la machine.
    Lancement d'un autre logiciel, scan d'un fichier, ...... pendant l'exécution.
    quand j'exécute il ya que la fenetre de l'exécutable qui marche, mais là je trouve une grande déffirence de 0.56s à 3 -4 seconde, meme en faisant l'exécution à pluisuers reprise j'ai jamais eu quelque chose de 0.5 ou 0.9 s toujours plus de 2s, est ce que ya pas une façon de minimiser cette différence????

  9. #9
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Salut,

    Il faut lancer ton processus ou la portion de code que tu analyses avec une priorité haute, de la sorte, le temps d'exécution dépendra plus de ton code que du temps processeur que le système aura "bien voulu" t'accorder en priorité normale.

    Il faut aussi penser à désactiver ton antivirus le temps de l'opération.

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    As-tu essayé "QueryPerformanceCounter" ?

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    Passe sous un système UNIX, où tu peux obtenir le temps que ton processus passe en user mode et en kernel mode grace à l'appel systèmes certifié POSIX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <sys/times.h>
    clock_t times(struct tms *buf );
    La somme de ces 2 durées te donnent ainsi la durée totale d'exécution de ton processus sans prendre en compte les durées de préemption.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par moldavi Voir le message
    Bonjour.

    As-tu essayé "QueryPerformanceCounter" ?
    Oui j'ai inclu "QueryPerformanceCounter" et j'avais des temps plus précis par exemple 3125.46 millisecondes donc c'est beacoup mieux que avant

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    boost::chrono ne serait-il pas plus approprié ici?
    C'est portable, précis, il y a les notions de "time_point" et de "duration" qui sont très pratiques pour toutes les manipulations et les transformations en diverses unités de temps sont triviales.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  14. #14
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    faut aussi faire plusieurs run et en prendre la mediane (si on veut le temps le plus plausible) ou le minimum (si on veut le temps optimal). Evitez la moyenne des runs, les benchs n'etant pas des variables aleatoires mais des series a longues traines.

    Sous linux, y a aussi les timer temps reel que boost.chrono encapsule.

  15. #15
    Membre actif
    Avatar de EtherOS
    Homme Profil pro
    Etudiant Polytechnicien
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Etudiant Polytechnicien
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 233
    Points
    233
    Par défaut pour mieux éclaircir ?
    Citation Envoyé par moldavi Voir le message
    Bonjour.

    As-tu essayé "QueryPerformanceCounter" ?
    Pour mieux t'éclaircir tu peux faire comme suit :

    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
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
    	LONGLONG Freq;
    	LONGLONG Now;
    	LONGLONG Last;
    	QueryPerformanceFrequency ( reinterpret_cast<LARGE_INTEGER*>(&Freq) );
    	QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>(&Last) );
    	Sleep(10); // pause for 10 mills
    
    	while(1)
    	{
    		QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>(&Now) );
    		LONGLONG EclapsedCount = Now - Last;
    		LONGLONG TimerResolution = 1000; //en Millisecondes
    		LONGLONG Millisecondes = EclapsedCount * TimerResolution / Freq;
    		cout << "Run speed: " << Millisecondes << " millisecons" << endl;
    		Last = Now;
    
    		Sleep(10);
    	}
    	cout << "voici un exemple juste pour t'aider" << endl;
    	return 0;
    }

  16. #16
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Joel F Voir le message
    faut aussi faire plusieurs run et en prendre la mediane (si on veut le temps le plus plausible) ou le minimum (si on veut le temps optimal). Evitez la moyenne des runs, les benchs n'etant pas des variables aleatoires mais des series a longues traines.
    Je suis globalement d'accord avec toi que la médiane ou le minimum sont de meilleures mesures que la moyenne pour un test de performances, le problème est qu'elles obligent à mesurer le temps individuellement, là où la moyenne permet de ne faire qu'une mesure de temps pour toute une répétition de calculs.

    Pour des petits calculs très rapides, je préfère donc faire plusieurs calculs de moyenne. Maintenant, pour des opérations plus longues, où le temps de mesure devient négligeable, je suis d'accord avec toi.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  17. #17
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Citation Envoyé par EtherOS Voir le message
    Pour mieux t'éclaircir tu peux faire comme suit :
    Etes-vous certain que ce message s'adresse à moi... Ou alors ma citation est juste là pour appuyer votre raisonnement ?

  18. #18
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Personellement je prefere utilise Boost.Chrono pour les mesures, avec l'horloge adequqte:

    - std::chrono ne peut pas garantir que l'implementation va etre suffisament precise, par exemple VC11 et VC12(qui n'est pas encore sorti) ont une precison de 8ms ce qui est enorme et impossible a utilser dans certains cas;
    - boost::chrono est tres precis parcequ'il utilise QueryPerformanceCounter avec l'horloge haute precision;
    - boost::chrono est suppose precis sur les platforms derivees d'unix aussi mais j'ai pas teste;

    Apres, faut avoir boost de pret dans une coin aussi...

  19. #19
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Je suis globalement d'accord avec toi que la médiane ou le minimum sont de meilleures mesures que la moyenne pour un test de performances, le problème est qu'elles obligent à mesurer le temps individuellement, là où la moyenne permet de ne faire qu'une mesure de temps pour toute une répétition de calculs.

    Pour des petits calculs très rapides, je préfère donc faire plusieurs calculs de moyenne. Maintenant, pour des opérations plus longues, où le temps de mesure devient négligeable, je suis d'accord avec toi.
    Disons que en general ca passe. Faut que je retrouve le papier sur le sujet ou le gars exhibeun programme C de 15 lignes completement anodin ou la moyenne du temps d'execution est en O(nb de run)

  20. #20
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Ou tout simplement la machine.
    Lancement d'un autre logiciel, scan d'un fichier, ...... pendant l'exécution.
    En effet je dispose de deux exécutable, le miens et un autre, je fait l'éxécution en meme temps sur la meme machine, le mien se termine avant l'autre mais le temps d'exécution affiché par mon exécutable est 3.14 seconde et l'autre exécutable affiche 0.22 seconde!!!! donc voilà une grande différence
    PS: je dispose pas du code source de l'autre exécutable donc je peux pas voir qu'est ce qu'il a utiliser comme fonction pour le calcul du temps.

    Voilà ce que j'utilise actuellment pour calculer le temps
    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
     
    #include <windows.h>
    double PCFreq = 0.0;
    __int64 CounterStart = 0;
    void StartCounter()
    {
        LARGE_INTEGER li;
        if(!QueryPerformanceFrequency(&li))
    	cout << "QueryPerformanceFrequency failed!\n";
     
        PCFreq = double(li.QuadPart)/1000.0;
     
        QueryPerformanceCounter(&li);
        CounterStart = li.QuadPart;
    }
    double GetCounter()
    {
        LARGE_INTEGER li;
        QueryPerformanceCounter(&li);
        return double(li.QuadPart-CounterStart)/PCFreq;
    }
    void main()
    {
    StartCounter();
    .............
    temps=GetCounter();
    cout<<"Temps d'execution "<<temps<<" millisecondes"<<endl;
    }

Discussions similaires

  1. Calculer le temps d'exécution d'une fonction
    Par ZAYDOUN dans le forum MATLAB
    Réponses: 3
    Dernier message: 11/07/2008, 14h45
  2. Calculer le temps d'exécution d'une procédure
    Par fring dans le forum Contribuez
    Réponses: 0
    Dernier message: 23/05/2008, 18h53
  3. Calculer le temps d'exécution d'une requête
    Par BRAUKRIS dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/03/2007, 12h59
  4. 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