Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2758 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [Visual C++?] temps d'execution

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Visual C++?] temps d'execution

n°823182
lunarnet76
Posté le 14-08-2004 à 15:45:30  profilanswer
 

lut!!! on voit souvent du monde qui dit que tel version d'un algorithme est plus rapide qu'un autre ... comment fait on pour savoir le temps que met le programme a s'éxécuté???
merci!!

mood
Publicité
Posté le 14-08-2004 à 15:45:30  profilanswer
 

n°823219
blackgodde​ss
vive le troll !
Posté le 14-08-2004 à 17:20:25  profilanswer
 

tu peux utiliser GetTickCount
ex :  
 

Code :
  1. DWORD temps_debut = GetTickCount();
  2. // ton code
  3. // temps d'execution (en ms)
  4. DWORD temps_execution = GetTickCount() - temps_debut;


 
sinon, de maniere portable, tu peux utilise boost::timer  
(www.boost.org)
 

Code :
  1. boost::timer t;
  2. // ton code
  3. std::cout << t.elapsed() << " secondes";



Message édité par blackgoddess le 14-08-2004 à 17:20:47

---------------
-( BlackGoddess )-
n°823403
lunarnet76
Posté le 15-08-2004 à 04:54:39  profilanswer
 

HUG!!!! euh je capte rien au site de boost et je sais meme pas quel est le truc a télécharger... si on pouvait m aider merci, sinon pareil la premiere solution avec DWORD, on fait comment pour l'utiliser?

n°823405
blackgodde​ss
vive le troll !
Posté le 15-08-2004 à 07:29:23  profilanswer
 

Code :
  1. #include <windows.h>
  2. #include <iostream>
  3. int main()
  4. {
  5.   DWORD temps_debut = GetTickCount();
  6.  
  7.   // ton code  
  8.  
  9.   // temps d'execution (en ms)  
  10.   DWORD temps_execution = GetTickCount() - temps_debut;
  11.   std::cout << "temps écoulé : " << temps_execution << " ms.";
  12. }


Message édité par blackgoddess le 15-08-2004 à 07:29:38

---------------
-( BlackGoddess )-
n°823412
Ace17
Posté le 15-08-2004 à 09:25:11  profilanswer
 

lunarnet76 a écrit :

telle version d'un algorithme est plus rapide qu'une autre ... comment fait on pour savoir le temps que met le programme a s'éxécuter???


Ce qui compte si tu veux comparer deux algorithmes, c'est principalement la complexité. Par exemple, pour un algorithme de tri, la complexité ca va etre le nombre de comparaisons réalisées pour trier une liste de longueur n. Dans la pratique on calcule rarement une complexité exacte, mais on sait l'estimer, et on sait comparer deux complexités : si j'ai un algo en O(n * log(n)) et un autre en O(n^2), et bien je sais que le premier algo est plus efficace ( je préviens que je simplifie quand meme pas mal ).

n°823621
lunarnet76
Posté le 15-08-2004 à 18:30:33  profilanswer
 

ah voila c bon, il me manquait le header windows.h!!
merci ca marche comme ca!
Sinon Ace17 je savais deja ca lol, mais je voulais un truc + exact !!
merci aussi!

n°823909
LeGreg
Posté le 16-08-2004 à 01:58:47  profilanswer
 

man time
 
ça marche très bien aussi

n°823914
lunarnet76
Posté le 16-08-2004 à 02:18:44  profilanswer
 

euh ... ca s utilise comment ca man time ???

n°823928
cris56
Posté le 16-08-2004 à 08:08:18  profilanswer
 

Code :
  1. #include <ctime>
  2. #include <iostream>
  3. int main()
  4. {
  5.     std::clock_t beg = std::clock();
  6.     // ton code
  7.     // temps en ms
  8.     std::cout << (std::clock() - beg) *1000 / CLOCK_TCK << '\n';
  9. }

n°824100
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-08-2004 à 12:36:55  profilanswer
 

RDTSC ça marche aussi très bien [:joce]

mood
Publicité
Posté le 16-08-2004 à 12:36:55  profilanswer
 

n°824101
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-08-2004 à 12:38:19  profilanswer
 

cris56 a écrit :

Code :
  1. std::cout << (std::clock() - beg) *1000 / CLOCK_TCK << '\n';



:non:

Code :
  1. std::cout << (std::clock() - beg) *1000 / CLOCK_TCK << std::endl;


;)

n°824176
blackgodde​ss
vive le troll !
Posté le 16-08-2004 à 13:40:51  profilanswer
 

chui pas convaincu que Taz soit de cet avis o_O
me semblait qu'il fallait laisser les flux gérer leurs flush tout seul


---------------
-( BlackGoddess )-
n°824217
HelloWorld
Salut tout le monde!
Posté le 16-08-2004 à 14:17:42  profilanswer
 

AMHA, c'est ce genre de débats qui fait du tord à C++. Ecrire une fonction main qui fait Hello World et qui sattisfasse tout le monde est proche de l'impossible, et c'est bien dommage selon moi. '\n' ou endl ou std::endl sont tous parfaitement acceptables.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°824226
Ace17
Posté le 16-08-2004 à 14:26:06  profilanswer
 

HelloWorld a écrit :

Ecrire une fonction main qui fait Hello World et qui sattisfasse tout le monde est proche de l'impossible

Je comprends maintenant pourquoi c'est si dur de poster du code sans s'en prendre plein la gueule :D

n°824459
cris56
Posté le 16-08-2004 à 19:07:55  profilanswer
 

Harkonnen a écrit :

:non:

Code :
  1. std::cout << (std::clock() - beg) *1000 / CLOCK_TCK << std::endl;


;)


 
je suis pas d'accord, je fais expres de mettre '\n' systematiquement car utilisée std::endl à outrance est une tres mauvaise habitude, bs l'utilise pratiquement pas dans c++ 3e ed
surtout que generalement cout est "line buffered", et endl juste avant la fin du bloc main ca sert un peu a rien

n°824468
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-08-2004 à 19:26:10  profilanswer
 

cris56 a écrit :

je suis pas d'accord, je fais expres de mettre '\n' systematiquement car utilisée std::endl à outrance est une tres mauvaise habitude, bs l'utilise pratiquement pas dans c++ 3e ed


je vois pas en quoi c'est une mauvaise habitude, franchement... si j'ai envie de flusher le buffer, j'ai le droit non ?
Stroustrup ne l'utilise peut être pas, mais Koenig & Moo l'utilisent à fond dans Accelerated C++, donc qui a raison et qui a tort ?

n°824474
cris56
Posté le 16-08-2004 à 19:33:45  profilanswer
 

voila ce que ca dit sur cpptips
 

Citation :

You also don't want to write 'std::endl' instead of '\n' because the
use of 'std::endl' would unnecessarily flush the stream's buffer. This
is a bad idea unless you really want to play save and have the buffer
flushed: Flushing the buffer can become a considerable performance
problem.


 
paroles d'hommes

n°824477
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-08-2004 à 19:42:29  profilanswer
 

cris56 a écrit :

voila ce que ca dit sur cpptips
 

Citation :

You also don't want to write 'std::endl' instead of '\n' because the
use of 'std::endl' would unnecessarily flush the stream's buffer. This
is a bad idea unless you really want to play save and have the buffer
flushed: Flushing the buffer can become a considerable performance
problem.


 
paroles d'hommes


de toute façon, c'est un débat stérile comme dit HelloWorld :o
certains utilisent le flush, d'autres non, c'est comme le mot clé "friend", certains l'utilisent, d'autres (dont moi) disent que c'est anti objet [:sinclaire]

n°824481
cris56
Posté le 16-08-2004 à 19:47:54  profilanswer
 

pas de probleme, donc on impose pas son point de vue
 

Harkonnen a écrit :

:non:

Code :
  1. std::cout << (std::clock() - beg) *1000 / CLOCK_TCK << std::endl;


;)

n°824484
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-08-2004 à 19:55:07  profilanswer
 

cris56 a écrit :

pas de probleme, donc on impose pas son point de vue


j'ai pas imposé, je voulais juste faire remarquer que je trouvais le "\n" malvenu ici étant donné l'utilisation de la STL dans le code donné en exemple (quitte à utiliser la STL, autant l'utiliser jusqu'au bout) [:sinclaire]
de toutes façons, les gouts et les couleurs.... et ce bon à rien de Taz, jamais ici quand on a besoin de son avis :o


---------------
J'ai un string dans l'array (Paris Hilton)
n°824486
chrisbk
-
Posté le 16-08-2004 à 20:00:59  profilanswer
 

putain, l'enculage de mouche

n°824714
PtitKiki
Le Vrai
Posté le 17-08-2004 à 08:45:09  profilanswer
 

par contre \n c moins long à taper que std::endl :)

n°824718
Ace17
Posté le 17-08-2004 à 08:58:32  profilanswer
 

Sauf que dans la pratique certains utilisent using namespace std, et donc on peut taper endl tout court, ce qui fait 4 caracteres, tout comme "\n"... :D
(les mouches n'ont qu'a bien se tenir)

n°824932
blackgodde​ss
vive le troll !
Posté le 17-08-2004 à 12:04:16  profilanswer
 

notons qu'avec un clavier fr aussi le \ se fait par la pression de 2 touches (simultanément en plus), donc a ce niveau endl serait peut-être plus avantageux.


---------------
-( BlackGoddess )-
n°825371
lunarnet76
Posté le 17-08-2004 à 18:52:17  profilanswer
 

non mais je reve, j'ai posé la question sur le temps d'executtion justement pour réglé ce genre de question a la con, vous avez juste a tésté la rapidité de endl, "/n" et std:endl et vous verrez bien lequel est le meilleur

n°825567
LeGreg
Posté le 17-08-2004 à 23:16:28  profilanswer
 

lunarnet76 a écrit :

euh ... ca s utilise comment ca man time ???


 
time nom_du_programme (en ligne de commande)
 
ça évite d'avoir à instrumenter le programme.
 
évidemment dès que ton programme gagne en complexité
c'est une bonne idée de l'instrumenter de toute façon.
(mais il faut être sioux pour mesurer les bonnes choses..)

n°827692
lsdYoYo
gravity powered
Posté le 20-08-2004 à 13:52:59  profilanswer
 

Pour ceux qui auraient besoin de mesurer des délais très courts ET qui sont sous Windose (9X, NT/2k, XP), le plus précis - et de loin -
c'est la fonction "QueryPerformanceCounter". La précision est meilleure que la micro-seconde  :ouch:  (3.579.545 ticks par seconde sur mon PC), voir la valeur retournée par la fonction "QueryPerformanceFrequency" !!!
 
Attention, le compteur est remis à zéro au boot, le nombre de ticks retourné devient très vite colossal : il faut du 64 bits (sinon overflow au bout de 35 minutes pour les micro-secondes et 23 jours pour les milli-secondes. Aucun problème, par contre, pour les secondes qui tiennent plus de 68 ans avec 32 bits. Mais on peut passer cette fonction aussi en 64 bits pour l'homogénéité).
Pour la petite histoire, lorsque j'ai installé mes premières applications en clientèle, ça se plantait régulièrement un peu plus d'une fois par mois - programmes tournants 24h/24. Il fallait obligatoirement rebooter Windows pour que ça reparte. Mes timers en
milli-secondes tombait en overflow et passait alors en négatif, ça n'a pas été facile de trouver l'origine du problème...  :heink:  
 
Assez causé, voici les sources.
"_i64" est un entier 64 bits ==> typedef __int64 _i64;
Mes sources sont pour C++ Builder, avec d'autres compilos comme Visual C++, il faut trouver l'équivalent de "__int64".
 

Code :
  1. typedef __int64 _i64;    //Changer éventuellement "__int64"
  2. //Super Timer : Résultat en micro-secondes
  3. _i64 TimerMicro(void)
  4. {
  5. static bool   tmrRead = false;
  6. static double tmrFreq;
  7. _i64 top;
  8. if(!tmrRead)              //1° appel : lecture résolution du timer
  9.    {
  10.     tmrRead = true;
  11.     QueryPerformanceFrequency((LARGE_INTEGER *) &top);  //Nbr ticks/sec
  12.     tmrFreq = double(top) / double(MILLION);            //Valeur micro
  13.    }
  14. QueryPerformanceCounter((LARGE_INTEGER *) &top);
  15. top = _i64(double(top) / tmrFreq);            //Ajuste timer en micro
  16. return(top);
  17. }
  18. //Timer à la milli-seconde      
  19. _i64 TimerMilli(void) { return(    TimerMicro() /    1000) ; }
  20. //Timer à la seconde        
  21. int  TimerSec(void)   { return(int(TimerMicro() / 1000000)); }


---------------
If I want to fail and succeed, which I have done ?
n°827754
blackgodde​ss
vive le troll !
Posté le 20-08-2004 à 14:42:04  profilanswer
 

__int64 egalement sous vc++


---------------
-( BlackGoddess )-
n°828109
cris56
Posté le 20-08-2004 à 21:44:18  profilanswer
 

et surtout des non signés, c'est mieux

n°828114
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-08-2004 à 21:58:05  profilanswer
 

RDTSC moi je dis, y'a pas plus précis pour mesurer le temps :o


---------------
J'ai un string dans l'array (Paris Hilton)
n°828129
chrisbk
-
Posté le 20-08-2004 à 22:08:03  profilanswer
 

Harkonnen a écrit :

RDTSC moi je dis, y'a pas plus précis pour mesurer le temps :o


 
le nombre de cycle, ouais, le temps je sais pas

n°828145
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-08-2004 à 22:24:53  profilanswer
 

chrisbk a écrit :

le nombre de cycle, ouais, le temps je sais pas


bah, si tu connais le nombre de cycles et la fréquence de ta machine, tu peux calculer le temps [:sinclaire]


---------------
J'ai un string dans l'array (Paris Hilton)
n°828147
cris56
Posté le 20-08-2004 à 22:31:16  profilanswer
 

ya pas une histoire comme quoi on est obligé de refraichir la valeur de la frequence ?

n°828153
farib
Posté le 20-08-2004 à 22:39:27  profilanswer
 

Harkonnen a écrit :

bah, si tu connais le nombre de cycles et la fréquence de ta machine, tu peux calculer le temps [:sinclaire]


wai, mais une telle précision est faussée par le multitache de la machine.


Message édité par farib le 20-08-2004 à 22:39:35

---------------
Bitcoin, Magical Thinking, and Political Ideology
n°829236
lsdYoYo
gravity powered
Posté le 23-08-2004 à 09:48:29  profilanswer
 

C'est sûr qu'avoir des timers hyper-précis (en-dessous de la milli ou micro-seconde) reste d'un intérêt très limité sous Windows ou tout autre système multi-tâche. Sans compter, le temps pris par la mesure elle-même. Pour être vraiment précis, il faut faire une moyenne sur plusieurs passes.
Perso, je n'emploi que mon timer en milli-seconde et il me sert avant tout à déclencher des traitements périodiques (tous les dixièmes de secondes appeller telle fonction).


---------------
If I want to fail and succeed, which I have done ?
n°829244
lsdYoYo
gravity powered
Posté le 23-08-2004 à 10:02:12  profilanswer
 

Pour cris56 :
- [et surtout des non signés, c'est mieux]
Bof, ça risque vraiment pas de passer en négatif !
Et puis, c'est plus simple en signé lorsque tu fais des calculs entre les ticks ou pour avoir des "magic value" comme -1.
- [ya pas une histoire comme quoi on est obligé de
   refraichir la valeur de la frequence ?]
Pour faire un timer portable avec RDTSC, il faut déterminer la fréquence du proc au départ  :sweat: . Et gaffe aux cas particuliers du style Intel SpeedStep ! Je pense que le RDTSC est utile surtout pour mesurer le nombre de cycle que prend une routine (hors interruptions). Il est top pour mesurer précisemment la fréquence du proc, ce que fait CPU-Z.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [Visual C++?] temps d'execution

 

Sujets relatifs
[C] changer de répertoire en cours d'exécutionchanger la langue de visual c++
EMEBEDDED VISUAL TOOLS, EMULATEUR?[Visual C++] Comment créer et modifier un label dans la statusbar
Fenêtre principale à la souris sous Visual ?ACCESS/ODBG sous visual C++
C++ ou Visual Basic ?... ou delphi ?Problème en visual basic - TabOrder --> Résolu
Probleme pour l'exécutionobtention du temps en millisecond en C,C++
Plus de sujets relatifs à : [Visual C++?] temps d'execution


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR