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 averti
    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
    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 967
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 3 967
    Par d�faut
    Joe,

    J'utilise QueryPerformanceCounter.

  3. #3
    Inactif  


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

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    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 : 51
    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
    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 averti
    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
    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 : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 averti
    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
    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 Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    D�tails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    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 : 51
    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
    Par d�faut
    Bonjour.

    As-tu essay� "QueryPerformanceCounter" ?

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    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 averti
    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
    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�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 297
    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 297
    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.

  14. #14
    Membre Expert
    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 : 45
    Localisation : France, Essonne (�le de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    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 tr�s 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
    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 : 51
    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
    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 : 51
    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
    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
    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 Expert
    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 : 45
    Localisation : France, Essonne (�le de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    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 averti
    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
    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