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

  FORUM HardWare.fr
  Programmation
  C++

  [c] temps d'exécution d'une fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c] temps d'exécution d'une fonction

n°223854
getoman33
Posté le 05-10-2002 à 10:00:49  profilanswer
 

bonjour,
je débute dans c et je sais pas comment calculer le temps d'exécution d'une fonction.. je pense qu'il faut faire un time() avant et un time() après et faire la différence des deux, mais je connais pas la syntaxe :-/
 
merci à tous ceux qui me répondront

mood
Publicité
Posté le 05-10-2002 à 10:00:49  profilanswer
 

n°223859
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-10-2002 à 10:51:01  profilanswer
 

Code :
  1. #include <time.h>
  2. time_t debut, fin;
  3. double duree;
  4. debut=time(NULL);
  5. /* des trucs */
  6. fin=time(NULL);
  7. duree=difftime(fin, debut);


 
la précision est de l'ordre de la seconde, c'est peu mais c'est standard. si tu veux chronométrer une fonction je te conseille de l'exécuter plusieurs fois (pour que le résultat ne soit pas faussé par un événement incongru) et de faire une moyenne (tu fais une boucle qui l'exécute 100fois (ou plus))  
 
 


---------------
du bon usage de rand [C] / [C++]
n°223942
Carbon_14
Posté le 05-10-2002 à 14:59:21  profilanswer
 

Si rapide, on peut aussi utiliser GetTickCount() avant et après et calculer la différence mais la précision n'est pas absolue (y a # 16 ticks par seconde donc on n'atteint pas la ms précise).
 
Si on lance le prog entre deux ticks, y aussi une imprécision..

n°223955
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-10-2002 à 15:55:46  profilanswer
 

c'est surtout archi pas standard, meme pas POSIX, laisse tomber cette solution


---------------
du bon usage de rand [C] / [C++]
n°223957
red factio​n
Posté le 05-10-2002 à 15:58:49  profilanswer
 

sinon ta QueryPerformanceTimer qui est tres precis   :)  

n°223958
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-10-2002 à 16:03:04  profilanswer
 

z'etes des pyshopates les gars, c'est une question sur le C pas sur l'API de windows (que je conchie d'ailleurs)


---------------
du bon usage de rand [C] / [C++]
n°223959
Carbon_14
Posté le 05-10-2002 à 16:03:59  profilanswer
 

Taz@PPC a écrit a écrit :

c'est surtout archi pas standard, meme pas POSIX, laisse tomber cette solution




 
Très juste, j'avais pas pensé aux nunuxiens et à la portabilité. Sous DOS, je me sert d'une INT pour "compter" les ticks.

n°223963
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-10-2002 à 16:32:13  profilanswer
 

les gens perdent trop souvent de vue que le C a été développé pour etre un langage hautement performant et portable.
 
et meme si vos fonctions de vos differentes API marchent (qui de borland, qui de VS, etc...), si vous voulez que getoman s'en servent, mettez le en garde et donnez lui au moins le prototype.


---------------
du bon usage de rand [C] / [C++]
n°223964
red factio​n
Posté le 05-10-2002 à 16:50:22  profilanswer
 

Taz@PPC a écrit a écrit :

les gens perdent trop souvent de vue que le C a été développé pour etre un langage hautement performant et portable.
 
et meme si vos fonctions de vos differentes API marchent (qui de borland, qui de VS, etc...), si vous voulez que getoman s'en servent, mettez le en garde et donnez lui au moins le prototype.




 
c pas facile de faire une application 100% portable. au depart javais commence un ptit jeu en opengl, puis jme suis rendu compte a un moment que je devait oublier cette idee

n°223965
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 05-10-2002 à 17:20:05  profilanswer
 

sinon t'as aussi la solution de compter le nombre de fois par seconde ou l'écran est redessiné, par une petite interruption VBL en asm [:ddr555]
 
je sors


---------------
J'ai un string dans l'array (Paris Hilton)
mood
Publicité
Posté le 05-10-2002 à 17:20:05  profilanswer
 

n°223967
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 05-10-2002 à 17:42:36  profilanswer
 

bon, trève de plaisanterie.
tu peux aussi mesurer le temps à l'aide d'un logiciel appelé profiler.
l'avantage, c'est que tu n'as pas à coder la mesure du temps, et donc tu peux faire un truc plus portable.


---------------
J'ai un string dans l'array (Paris Hilton)
n°223971
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-10-2002 à 18:32:50  profilanswer
 

ben il faut un soft en plus et compiler avec certaines options, tout depend de ce qu'on veut. mais le profiler est tres bon pour ca
 
 
pour gcc, compilez tous warnings a fond, en -ggdb -pg (et mettez pas les options de réductions de tailles pour windows). ensuite, executez une fois votre programme. reste plus qu'a faire un "gprof a.exe > report.txt"  :hello:


---------------
du bon usage de rand [C] / [C++]
n°223995
Carbon_14
Posté le 05-10-2002 à 19:51:01  profilanswer
 

Quand je cherche à améliorer mon code, pour aller vite, souvent j'utilise une boucle pour répéter (un beep avant, un beep après) et ma montre pour mesurer le temps. :D C'est très portable, et sur le 486/100, on voit mieux la différence que sur un 1GHz :D .
 
Quand on est sur PC (pas Mac), on peut aussi reprogrammer temporairement un des compteurs du 8253 pour les écarts assez faibles. Mais c'est pas très versatile non plus.


Message édité par Carbon_14 le 05-10-2002 à 19:51:39
n°223997
ITM
Avatar peint à la main
Posté le 05-10-2002 à 19:55:54  profilanswer
 

Code :
  1. ...
  2. #include<time.h>
  3. ...
  4. double temps;
  5. clock_t start;
  6. ...
  7.    start = clock(); //le compteur
  8.    la_fonction_à_chronométrer();
  9.    temps = (double)(clock()-start)/(double)CLOCKS_PER_SEC;
  10.    printf("\nRecherche terminée en %.2f seconde(s)!\n", temps);
  11. ...


Merci qui  [:0iimou]


Message édité par ITM le 05-10-2002 à 19:56:45

---------------
iteme.free.fr | Mon feedback
n°224004
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-10-2002 à 20:44:50  profilanswer
 

clock marche aussi, mais le résultat est changeant... c au moins aussi preci que time_t selon le committé ISO. et aussi precis que l'implémentation le peut.
 
donc c'est quelque part. mieux vaut utiliser les time_t qui son réutilisables par ailleurs


Message édité par Taz@PPC le 05-10-2002 à 20:45:35

---------------
du bon usage de rand [C] / [C++]
n°224018
HelloWorld
Salut tout le monde!
Posté le 05-10-2002 à 22:35:06  profilanswer
 

Citation :

Si rapide, on peut aussi utiliser GetTickCount() avant et après et calculer la différence mais la précision n'est pas absolue (y a # 16 ticks par seconde donc on n'atteint pas la ms précise).  
 
Si on lance le prog entre deux ticks, y aussi une imprécision...


 
Arf Carbon_14, tu persistes avec ton histoire de 16 tick ... :)
Sous Win32, c'est révolu ca.
GetTickCount est precis a la ms près. Un simple test t'en convaincra.
 

Citation :

c'est surtout archi pas standard, meme pas POSIX, laisse tomber cette solution


 
Le mec n'a pas precise sous quel OS il bossait et s'il utilisais ou non les API Win32.
Si c'est le cas, cette solution est parfaitement acceptable vu qu'il ne recherche pas la portabilite.
De plus, mesurer le temps d'execution d'une boucle, c'est generalement lors de la phase de developpement, et donc sa ligne non standard va degager de la version finale. Selon moi même pour un prog qui se veut portable (mais qui est developpe sous Win32) cette solution est acceptable (si c'est bien pour du test de performance lors du developpement)
 

Citation :

sinon ta QueryPerformanceTimer qui est tres precis   :)


J'ai l'impression que sous Win2K/Xp, il n'y a plus d'ecart significatif entre le timer classique et le performance timer.
Sous 98 il y a rapidement un gros ecart, mais testé sous XP, je n'ai pas trouvé de difference ... !
 

Citation :

Quand on est sur PC (pas Mac), on peut aussi reprogrammer temporairement un des compteurs du 8253 pour les écarts assez faibles. Mais c'est pas très versatile non plus.


 
Il me semble que c'est une bidouille reservee a DOS ca ... (mais non je te cherche pas ;))
 
Tout ca pour dire (une énième fois :() : sous quel OS tu es et quelle precision tu cherches ?
Au passage, cette question a été mainte fois traitee et doit facilement etre retrouvee via une recherche.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°224060
bjone
Insert booze to continue
Posté le 06-10-2002 à 00:44:30  profilanswer
 

en précision pure, y'a pas mieux que d'utiliser l'instruction RDTSC qui retourne dans EDX:EAX un compteur 64 bits s'incrémentant avec l'horloge CPU.
 
C'est par cette technique que les fréquences CPU effectives sont mesurables au pouillième de khz près...
 
On peut controller avec le temps pris en cycles d'horloges cpu que prends une portion de code.
 
Le problème des autres approches est qu'il faut assez d'itérations devant le pas de mesure pour avoir n'importe quoi comme mesure....
 
(souvent les profilers utilisent RDTSC)

n°224117
Carbon_14
Posté le 06-10-2002 à 11:22:42  profilanswer
 

HelloWorld a écrit a écrit :

 
Arf Carbon_14, tu persistes avec ton histoire de 16 tick ... :)
Sous Win32, c'est révolu ca.
GetTickCount est precis a la ms près. Un simple test t'en convaincra.




 
Merci pour l'info. Faudra que je teste un jour. On a 4/5 des PCs de manips de physique et de spectro sous Win 3.1(1) :D. Obligé de rester "basique".
 
Faudrait plutôt que je me taise avec mes vieux trucs. :lol: :lol:

n°224119
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 06-10-2002 à 11:24:59  profilanswer
 

sinon je peux aussi vous parlez de sys/timeb.h et de ftime


---------------
du bon usage de rand [C] / [C++]
n°224383
BifaceMcLe​OD
The HighGlandeur
Posté le 07-10-2002 à 10:53:17  profilanswer
 

carbon_14 a écrit a écrit :

 
 
Merci pour l'info. Faudra que je teste un jour. On a 4/5 des PCs de manips de physique et de spectro sous Win 3.1(1) :D. Obligé de rester "basique".
 
Faudrait plutôt que je me taise avec mes vieux trucs. :lol: :lol:  




Pas des vieux trucs : les PC sous Win98SE, ça reste courant, mais on y trouve encore les ticks tous les 18,2 fois par seconde environ (pas 16, désolé :D). Et je ne serais pas surpris que ce soit toujours le cas sous Windows Meuh. Par contre, c'est vrai que ça a disparu sous Windows NT/2000/XP.

n°225744
kenshiro18​2
Posté le 09-10-2002 à 16:45:31  profilanswer
 

Windows:
QueryPerformanceCounter, QueryPerformanceFrequency
 
Unix:
gettimeofday

n°225748
kenshiro18​2
Posté le 09-10-2002 à 16:47:40  profilanswer
 

J'oubliais. Pour pouvoir mesure le temps d'execution d'une fonction par rapport a d'autres parties du code, tu peux utiliser un Profiler. Il y en a un notemment a Visual C++..

n°225803
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 09-10-2002 à 18:44:30  profilanswer
 

:non: linux -> times()
 
http://www.hmug.org/man/3/times.html
 
ou tout simplement times a.out


---------------
du bon usage de rand [C] / [C++]
mood
Publicité
Posté le   profilanswer
 


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

  [c] temps d'exécution d'une fonction

 

Sujets relatifs
[C] declaration d'une fonction qui retourne une adr en mem. [resolu][C] Je recherche une fonction remplaçant un caractère par un autre
Fonction Excel Personnalisée?c koi la fonction pour rechercher un mot dans une chaine de caractères
[VISUAL C++] difference d execution entre mode debug et release[C] signal() et paramteres de la fonction a executer...
PHP - Execution automatique d'un scriptprobleme pour gerer le temps
Pb d'éxécution de dll en runtimeAPI - Est il possible de définir un temps d'execution d'une fonction
Plus de sujets relatifs à : [c] temps d'exécution d'une fonction


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