Page 1 sur 1

ElapsedNanoseconds() - Temps système écoulés en nanosecondes

Publié : lun. 27/févr./2012 23:26
par Le Soldat Inconnu
Salut,

J'avais besoin de plus précis que le ElapsedMilliseconds.

Donc voici 1000 fois plus précis

Code : Tout sélectionner

Procedure.q ElapsedTime()
	Protected ElapsedTime.q
	QueryPerformanceCounter_(@ElapsedTime)
	ProcedureReturn ElapsedTime
EndProcedure

Procedure.q ElapsedNanoseconds()
	Protected ElapsedTime.q
	Static Frequency.q
	QueryPerformanceCounter_(@ElapsedTime)
	If Frequency = 0
		QueryPerformanceFrequency_(@Frequency)
	EndIf
	ElapsedTime * 1000000 / Frequency
	ProcedureReturn ElapsedTime
EndProcedure

Temps1 = ElapsedTime()
Delay(1000)
Temps2 = ElapsedTime()
Delay(1000)
Temps3 = ElapsedTime()
Delay(1000)
Temps4 = ElapsedTime()

Debug "Retour du compteur de performance"
Debug Temps2 - Temps1
Debug Temps3 - Temps2
Debug Temps4 - Temps3

Temps1 = ElapsedNanoseconds()
Delay(1000)
Temps2 = ElapsedNanoseconds()
Delay(1000)
Temps3 = ElapsedNanoseconds()
Delay(1000)
Temps4 = ElapsedNanoseconds()

Debug "Temps système écoulé en nanosecondes"
Debug Temps2 - Temps1
Debug Temps3 - Temps2
Debug Temps4 - Temps3

Re: ElapsedNanoseconds() - Temps système écoulés en nanoseco

Publié : lun. 27/févr./2012 23:46
par case
8O

je savais pas qu'on pouvait avoir plus précis que la milliseconde en temps système

Re: ElapsedNanoseconds() - Temps système écoulés en nanoseco

Publié : lun. 27/févr./2012 23:56
par Backup
pareil ! ;)

Re: ElapsedNanoseconds() - Temps système écoulés en nanoseco

Publié : mar. 28/févr./2012 7:49
par comtois
case a écrit :je savais pas qu'on pouvait avoir plus précis que la milliseconde en temps système
C'est que tu ne lis pas assez la FAQ de DVP :)

Re: ElapsedNanoseconds() - Temps système écoulés en nanoseco

Publié : mar. 28/févr./2012 8:41
par PAPIPP
Bonjour LSI
J'ai obtenu des valeurs négatives.
Après correction TEMPSx.Q, les résultats sont meilleurs.

Code : Tout sélectionner

Procedure.q ElapsedTime()
  Protected ElapsedTime.q
  QueryPerformanceCounter_(@ElapsedTime)
  ProcedureReturn ElapsedTime
EndProcedure

Procedure.q ElapsedNanoseconds()
  Protected ElapsedTime.q
  Static Frequency.q
  QueryPerformanceCounter_(@ElapsedTime)
  If Frequency=0
    QueryPerformanceFrequency_(@Frequency)
  EndIf
  ElapsedTime*1000000/Frequency
  ProcedureReturn ElapsedTime
EndProcedure

Temps1.q=ElapsedTime()
Delay(1000)
Temps2.q=ElapsedTime()
Delay(1000)
Temps3.q=ElapsedTime()
Delay(1000)
Temps4.q=ElapsedTime()

Debug "Retour du compteur de performance"
Debug Temps2-Temps1
Debug Temps3-Temps2
Debug Temps4-Temps3

Temps1=ElapsedNanoseconds()
Delay(1000)
Temps2=ElapsedNanoseconds()
Delay(1000)
Temps3=ElapsedNanoseconds()
Delay(1000)
Temps4=ElapsedNanoseconds()

Debug "Temps système écoulé en nanosecondes"
Debug Temps2-Temps1
Debug Temps3-Temps2
Debug Temps4-Temps3

@+

Re: ElapsedNanoseconds() - Temps système écoulés en nanoseco

Publié : mar. 28/févr./2012 8:46
par djes
Oui, c'est vieux comme Hérode ce truc, mais bon, c'est bien d'avoir un topic là-dessus ;)

A noter que c'est moyennement fiable, voir là : http://www.purebasic.fr/english/viewtop ... ceCounter_, sauf à avoir besoin d'un comptage très précis assez court sur la durée.

Il y a plusieurs exemples sur les forums.

Re: ElapsedNanoseconds() - Temps système écoulés en nanoseco

Publié : mar. 28/févr./2012 9:17
par PAPIPP
Bonjour à tous

La procédure suivante donne le nombre de cycle machine. Elle évite les API
Et d’autre part elle donne les mêmes résultats.

Code : Tout sélectionner

Procedure.q nbcs()
  !RDTSC
  ProcedureReturn
EndProcedure
http://www.purebasic.fr/french/viewtopi ... TSC#p97997

On peut donc trouver un rapport entre le nb de cycles et le temps en nanoseconde.

Code : Tout sélectionner

Procedure.q nbcs()
  !RDTSC
  ProcedureReturn
EndProcedure

Procedure.q ElapsedTime()
  Protected ElapsedTime.q
  QueryPerformanceCounter_(@ElapsedTime)
  ProcedureReturn ElapsedTime
EndProcedure

Procedure.q ElapsedNanoseconds()
  Protected ElapsedTime.q
  Static Frequency.q
  QueryPerformanceCounter_(@ElapsedTime)
  If Frequency=0
    QueryPerformanceFrequency_(@Frequency)
  EndIf
  ElapsedTime*1000000/Frequency
  ProcedureReturn ElapsedTime
EndProcedure

Temps1.q=ElapsedTime()
Delay(1000)
Temps2.q=ElapsedTime()
Delay(1000)
Temps3.q=ElapsedTime()
Delay(1000)
Temps4.q=ElapsedTime()

Debug "Retour du compteur de performance"
Debug Temps2-Temps1
Debug Temps3-Temps2
Debug Temps4-Temps3

Temps1=ElapsedNanoseconds()
Delay(1000)
Temps2=ElapsedNanoseconds()
Delay(1000)
Temps3=ElapsedNanoseconds()
Delay(1000)
Temps4=ElapsedNanoseconds()

Debug "Temps système écoulé en nanosecondes"
Debug Temps2-Temps1
Debug Temps3-Temps2
Debug Temps4-Temps3

Temps1=nbcs()
Delay(1000)
Temps2=nbcs()
Delay(1000)
Temps3=nbcs()
Delay(1000)
Temps4=nbcs()
Debug "Temps système écoulé en cycle"
Debug Temps2-Temps1
Debug Temps3-Temps2
Debug Temps4-Temps3

@+

Re: ElapsedNanoseconds() - Temps système écoulés en nanoseco

Publié : mar. 28/févr./2012 9:53
par djes
Notre ami idle avait fait un très beau code là-dessus : http://www.purebasic.fr/english/viewtop ... ceCounter_

Re: ElapsedNanoseconds() - Temps système écoulés en nanoseco

Publié : jeu. 01/mars/2012 9:35
par djes