Page 1 sur 1

Chronometrer les fontions

Publié : jeu. 09/nov./2006 15:42
par Fig
Bonjour,

Je suis sûr que qques uns d'entre vous se sont déja penché sur le problème de savoir quel était entre deux codes ou deux instructions la plus rapide.
Je cherche un bout de code pour chronometrer précisement une éxecution.

par exemple :

Code : Tout sélectionner

[pseudo code ON]
startchrono()
for i=1 to 2000
instruction(s) à tester
next i

finchrono()

affiche le temps écoulé en msec.
[/pseudocode OFF]
Si quelqu'un a ça dans sa boite à outil, ça m'interresse :onfire:

Publié : jeu. 09/nov./2006 15:47
par Progi1984

Code : Tout sélectionner

Global Chrono

Procedure StarChrono()
 chrono = EllapsedMillisecs()
endprocedure

Procedure StopChrono()
 fin = EllapsedMillisecs() - Chrono
 debug fin
endprocedure

Publié : jeu. 09/nov./2006 16:00
par Fig
#heaven

heu qui c ki se tape encore l'air #jaune ?


c moa


Merci bien en tout cas :wink:

Publié : jeu. 09/nov./2006 17:03
par Flype
Progi1984 a écrit :

Code : Tout sélectionner

Global Chrono

Procedure StarChrono()
 chrono = EllapsedMillisecs()
endprocedure

Procedure StopChrono()
 fin = EllapsedMillisecs() - Chrono
 debug fin
endprocedure
oui en gros c'est çà.
sauf que - ATTENTION - on ne devrait jamais faire des tests de vitesse
avec le debugger activé !

donc vaut mieux un truc du genre :

Code : Tout sélectionner

Macro StarChrono()
  chrono = EllapsedMillisecs()
EndMacro

Macro StopChrono()
  MessageRequester("resultat", Str(EllapsedMillisecs() - chrono))
EndMacro

Publié : jeu. 09/nov./2006 17:04
par Progi1984
JE sais... ms j'ai fait ca de tete et rapidement !

Mais j'ai fait une erreur :(

PS : as tu vu cairo en MP ?

Publié : jeu. 09/nov./2006 17:07
par Flype
pas encore progi - je vais voir.

Publié : jeu. 09/nov./2006 19:28
par Droopy
Pour mesurer des valeurs inférieurs à la ms il y a ceci :

Code : Tout sélectionner

; Idea from Erix14 / Djes
; Return the time elapsed between Start & Stop in second
; 0.001 = 1 ms
; 0.000001=1 µs
; Caution ! : If the installed hardware supports a high-resolution performance counter
; MeasureHiResIntervalStart return 1 / 0 if no hardware support 
; Use this functions for measure interval < 1 ms

Global MeasureHiResIntervalTime.l

ProcedureDLL MeasureHiResIntervalStart()
  QueryPerformanceFrequency_(@retour)
  If retour <>0 : retour = 1 : EndIf
  QueryPerformanceCounter_(@MeasureHiResIntervalTime)  
  ProcedureReturn retour
EndProcedure

ProcedureDLL.f MeasureHiResIntervalStop()
  QueryPerformanceCounter_(@Temp)
  Difference=Temp-MeasureHiResIntervalTime
  QueryPerformanceFrequency_(@HiResTimerFrequency)
  Periode.f=1/HiResTimerFrequency
  DureeTotale.f=Difference*Periode
  ProcedureReturn DureeTotale
EndProcedure


;/ Test1 : For Next
If MeasureHiResIntervalStart()
  For n=0 To 10000
  Next n
  Debug MeasureHiResIntervalStop()
EndIf

;/ Test2 : Repeat : Until
If MeasureHiResIntervalStart()
  Repeat
    a+1
  Until a=10000
  Debug MeasureHiResIntervalStop()
EndIf

Debug "The fastest is For/Next"