Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Für allgemeine Fragen zur Programmierung mit PureBasic.
funker
Beiträge: 33
Registriert: 02.06.2014 12:32

Gibt es noch eine kleinere Zeit: ElapsedMilliseconds()

Beitrag von funker »

Hallo, guten Tag .
Gine es noch eine kleinere Zeiteinheit zum Afragen?

Danke.
Gruss
Benutzeravatar
HeX0R
Beiträge: 3070
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

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

Beitrag von HeX0R »

funker
Beiträge: 33
Registriert: 02.06.2014 12:32

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

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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"
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funker
Beiträge: 33
Registriert: 02.06.2014 12:32

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

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funker
Beiträge: 33
Registriert: 02.06.2014 12:32

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

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funker
Beiträge: 33
Registriert: 02.06.2014 12:32

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

Beitrag von funker »

Jup danke.

Werde ich jetzt anwenden.

Gruss
Antworten