Seite 1 von 1

Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 12:39
von funker
Hallo, guten Tag .
Gine es noch eine kleinere Zeiteinheit zum Afragen?

Danke.
Gruss

Re: Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 14:09
von HeX0R

Re: Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 15:35
von funker
Wie kann man hier von bitte eine hochgenaue Zeitabfrage zwischen 2 Positionen machen?

Danke.
GRuss

Code: Alles auswählen

Procedure.q ElapsedCPUCycles()  
  Protected tc.q
    QueryPerformanceCounter_(@tc.q)
  ProcedureReturn tc.q
EndProcedure

mytimer.q =  ElapsedCPUCycles()  

Debug mytimer.q

Re: Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 15:41
von STARGÅTE

Code: Alles auswählen

Global QueryPerformanceFrequency.q : QueryPerformanceFrequency_(@QueryPerformanceFrequency)

Procedure.f MeasureTime() ; Gibt die Zeitdifferenz wischen zwei Aufrufen zurück (in Sekunden)
	Static OldTime.q
	Protected Time.q, Delay.f
	QueryPerformanceCounter_(@Time)
	Delay = (Time - OldTime)/QueryPerformanceFrequency
	OldTime = Time
	ProcedureReturn Delay
EndProcedure

MeasureTime()

Delay(0) ; hier irgendwelche Sachen ...

Debug StrF(MeasureTime()*1e6)+" µs"

Re: Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 16:23
von funker
Jup danke.

Wie kann man µs abfrage ohne über eine Procedure machen zwischen 2 Ereignissen.
Weil das aufrufen der Procedure verbraucht auch schon Zeit.

Ich brauche es sehr genau, weil ich eine Wave-Datei zerlegen möchte in Byte.
Das heißt eine Wavdatei Zeitgenau aus dem Memspeicher auslesen: 1/44000Hz genauigkeit

Danke.
Gruss

Re: Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 17:25
von NicTheQuick
Ähm, Moment mal. Ich glaube du gehst da an irgendwas ganz falsch ran.
Fang lieber mal von vorne an zu erklären, was du vorhast. Wahrscheinlich versuchst du gerade etwas, was niemals funktionieren wird auf deine Weise.

Re: Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 18:24
von STARGÅTE
funker hat geschrieben:Wie kann man µs abfrage ohne über eine Procedure machen zwischen 2 Ereignissen.
Weil das aufrufen der Procedure verbraucht auch schon Zeit.
Auch die Funktion selbst ist ein Aufruf.
Und selbst diese "genaue" Zeitmessung hat eine Auflösungsgrenze von einigen µs.
funker hat geschrieben:Das heißt eine Wavdatei Zeitgenau aus dem Memspeicher auslesen: 1/44000Hz genauigkeit
Das geht nicht. Dafür ist die Zeitmessung der CPU nicht geeignet.
Das musst du wenn dann berechnen.
Also errechnen, wie viele Bytes bei einer Frequenz von 44kHz und Signalauflöung innerhalb von x-µs liegen müssten

Re: Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 20:07
von funker
Jup danke.

Ich möchte eine Zeit messen ohne Procedure:
-zeit festhalten
- a=b+c
-zeit ausgeben
-zeit festhalten
- a=b/c
-zeit ausgeben

Ds möchte ich bitte einmal wissen, wie das geht?

Danke.
Gruss

Re: Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 20:14
von STARGÅTE
Dieses Beispiel geht nicht!
Für b+c brauch eine CPU ca. 1 Taktzyklus, bei einer 3,6 GHz Maschine wäre das eine Zeit von 0,28 Nanosekunden!!

Um Zeit von einem Befehl zu messen, musst du den Befehl mehrmals aufführen und dann durch die Ausführungsschnitte teilen.
Um den Fehler durch die Schleife selbst zu minimieren, kannst du die Schleife noch mal im Leerlauf messen.

Zum Beispiel so:

Code: Alles auswählen

Prototype.i MeasureEvaluationTime_Function()

Procedure.i MeasureEvaluationTime_EmptyFunction()
EndProcedure

Procedure.d MeasureEvaluationTime(Function.MeasureEvaluationTime_Function)
	Protected Frequency.q, Time0.q, Time1.q, Time2.q
	Protected Loop.i, Loops.i=1
	QueryPerformanceFrequency_(@Frequency)
	Repeat
		Loops * 2
		QueryPerformanceCounter_(@Time0)
		For Index = 1 To Loops
			MeasureEvaluationTime_EmptyFunction()
		Next
		QueryPerformanceCounter_(@Time1)
		For Index = 1 To Loops
			Function()
		Next
		QueryPerformanceCounter_(@Time2)
	Until Time2 - Time1 > 1000000
	ProcedureReturn ((Time2-Time1)-(Time1-Time0))/Frequency/Loops
EndProcedure




Procedure Function()
	Protected a.f = 1.23
	Sin(a)
EndProcedure

Define Time.d = MeasureEvaluationTime(@Function())

MessageRequester("EvaluationTime", StrD(Time*1e9,3)+" ns")
In die Procedure Funktion() kannst du nun deinen zu messenden Befehl schreiben, wie im Beispiel Sin(a).
Die Ausgabe wäre dann zB:
---------------------------
EvaluationTime
---------------------------
18.080 ns
---------------------------
OK
---------------------------
Das heißt, die CPU brauch etwa 18 Nanosekunden oder 0,018 µm oder 0,000018 ms

Re: Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Verfasst: 26.06.2014 21:37
von funker
Jup danke.

Werde ich jetzt anwenden.

Gruss