Seite 1 von 1

Präziser Timer

Verfasst: 20.08.2013 17:46
von Piwo
Hi Leute,
ich wollte einige meiner genutzten Prozeduren und Algorithmen auf Effizienz vergleichen.
Im Rahmen dessen schreibe ich einen kleinen Timer/Counter welcher quasi einfach die Zeit zwischen einem start() und dem stop() misst und mir dann die millisek, sek, min... etc. ausgibt. Mit elapsedmillisecounds() auch gar kein problem, allerdings habe ich hierzu nun 2 Fragen:
1. Computer sind nunmal schnell und bei einigen Prozeduren sind millisekunden viel zu viel... gibt es eine Möglichkeit hier präziser zu werden und im µ-sek Bereich zu zählen?
2. Wäre meine überlegte Lösung effizient genug um den CPU nicht zu sehr zu behindern? Möchte ja vermeiden dass durch einen ineffizienten Zähler meine Ergebnisse verfälscht werden.

Bin für ein paar Denkanstöße sehr dankbar :)

Re: Präziser Timer

Verfasst: 20.08.2013 17:55
von Christian+
Die einfachste und erprobte Variante für deinen Anwendungsfall ist einfach die Procedere mehrfach aufzurufen.
Dann dauert es länger und du kannst die benötigte Zeit durch die Anzahl der Aufrufe teilen um Werte im µ-sek Bereich zu messen.

Alternativ gibt es auch sehr genaue Timer such mal nach "QueryPerformance" oder "High Resolution Timer" da solltest du was finden.

Re: Präziser Timer

Verfasst: 20.08.2013 19:25
von STARGÅTE
Wenn du wirklich so genau messen willst, dann müsstest du erst mal dafür sorgen, das die CPU während deiner Messung keine andere Sachen unternimmt. Es ist also noch eine ganze menge mehr nötig.

Normalerweise reicht aber ElapsedMilliseconds() verbunden mit einer Schleife in der deine Funktion mehrmals aufgerufen wird, und die Zeit am ende dann durch die Anzahl geteilt wird.

Ansonsten kannst du wie Christian+ bereits schrieb, unter Windows QueryPerformanceCounter_() nutzen.
Der hat (von System zu System unterschiedlich) eine Auflösung von ca 15µs

Code: Alles auswählen

Global QueryPerformanceCounter.q, QueryPerformanceFrequency.q
QueryPerformanceFrequency_(@QueryPerformanceFrequency)

Procedure StartTimer()
	QueryPerformanceCounter_(@QueryPerformanceCounter)
EndProcedure

Procedure.d StopTimer()
	Protected Counter.q
	QueryPerformanceCounter_(@Counter)
	ProcedureReturn (Counter-QueryPerformanceCounter)/QueryPerformanceFrequency
EndProcedure


StartTimer()
Delay(5)
Debug StopTimer()

Debug "Auflösung: "+StrF(QueryPerformanceFrequency*1e-6)+"µs"

Re: Präziser Timer

Verfasst: 20.08.2013 20:37
von Piwo
Alles klar vielen dank für eure Hilfe, ich werde denke ich beide messmethoden mal für mich ausprobieren :)

Re: Präziser Timer

Verfasst: 21.08.2013 20:20
von mk-soft
Ach Ja...

Zur Erinnerung... Windows ist KEIN Echtzeitbetriebssystem wie VxWorks

:mrgreen: