Präziser Timer

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Piwo
Beiträge: 27
Registriert: 05.08.2012 22:40

Präziser Timer

Beitrag 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 :)
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: Präziser Timer

Beitrag 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.
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Präziser Timer

Beitrag 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"
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
Benutzeravatar
Piwo
Beiträge: 27
Registriert: 05.08.2012 22:40

Re: Präziser Timer

Beitrag von Piwo »

Alles klar vielen dank für eure Hilfe, ich werde denke ich beide messmethoden mal für mich ausprobieren :)
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Präziser Timer

Beitrag von mk-soft »

Ach Ja...

Zur Erinnerung... Windows ist KEIN Echtzeitbetriebssystem wie VxWorks

:mrgreen:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten