[Visual C++?] temps d'execution

temps d'execution [Visual C++?] - C++ - Programmation

Marsh Posté le 14-08-2004 à 15:45:30    

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!!

Reply

Marsh Posté le 14-08-2004 à 15:45:30   

Reply

Marsh Posté le 14-08-2004 à 17:20:25    

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 )-
Reply

Marsh Posté le 15-08-2004 à 04:54:39    

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?

Reply

Marsh Posté le 15-08-2004 à 07:29:23    

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 )-
Reply

Marsh Posté le 15-08-2004 à 09:25:11    

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 ).

Reply

Marsh Posté le 15-08-2004 à 18:30:33    

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!

Reply

Marsh Posté le 16-08-2004 à 01:58:47    

man time
 
ça marche très bien aussi

Reply

Marsh Posté le 16-08-2004 à 02:18:44    

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

Reply

Marsh Posté le 16-08-2004 à 08:08:18    

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. }

Reply

Marsh Posté le 16-08-2004 à 12:36:55    

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

Reply

Marsh Posté le 16-08-2004 à 12:36:55   

Reply

Marsh Posté le 16-08-2004 à 12:38:19    

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;


;)

Reply

Marsh Posté le 16-08-2004 à 13:40:51    

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 )-
Reply

Marsh Posté le 16-08-2004 à 14:17:42    

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
Reply

Marsh Posté le 16-08-2004 à 14:26:06    

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

Reply

Marsh Posté le 16-08-2004 à 19:07:55    

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

Reply

Marsh Posté le 16-08-2004 à 19:26:10    

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 ?

Reply

Marsh Posté le 16-08-2004 à 19:33:45    

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

Reply

Marsh Posté le 16-08-2004 à 19:42:29    

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]

Reply

Marsh Posté le 16-08-2004 à 19:47:54    

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;


;)

Reply

Marsh Posté le 16-08-2004 à 19:55:07    

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)
Reply

Marsh Posté le 16-08-2004 à 20:00:59    

putain, l'enculage de mouche

Reply

Marsh Posté le 17-08-2004 à 08:45:09    

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

Reply

Marsh Posté le 17-08-2004 à 08:58:32    

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)

Reply

Marsh Posté le 17-08-2004 à 12:04:16    

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 )-
Reply

Marsh Posté le 17-08-2004 à 18:52:17    

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

Reply

Marsh Posté le 17-08-2004 à 23:16:28    

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..)

Reply

Marsh Posté le 20-08-2004 à 13:52:59    

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 ?
Reply

Marsh Posté le 20-08-2004 à 14:42:04    

__int64 egalement sous vc++


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 20-08-2004 à 21:44:18    

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

Reply

Marsh Posté le 20-08-2004 à 21:58:05    

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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-08-2004 à 22:08:03    

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

Reply

Marsh Posté le 20-08-2004 à 22:24:53    

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)
Reply

Marsh Posté le 20-08-2004 à 22:31:16    

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

Reply

Marsh Posté le 20-08-2004 à 22:39:27    

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
Reply

Marsh Posté le 23-08-2004 à 09:48:29    

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 ?
Reply

Marsh Posté le 23-08-2004 à 10:02:12    

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed