Aufrufdauer einer Prozedur ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Aufrufdauer einer Prozedur ermitteln

Beitrag von Chimorin »

Heyho,

gibt es eine Möglichkeit mit den Debuggertools festzustellen, wie lange eine Prozedur zur Ausführung braucht (Es gibt ja auch einen Zähler, der die Anzahl der Aufrufe notiert).
Ich habe das Gefühl, dass meine Listenverwaltung immer noch zu langsam ist (Mit ChangeCurrentElement() dürfte aber kein Problem bestehen, hmm...). Jetzt weiß ich aber nicht, wie ich den Teil suchen soll, der Schuld an der kurzzeitigen Leistungseinbuße im Programm ist.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Aufrufdauer einer Prozedur ermitteln

Beitrag von RSBasic »

Du kannst doch vor und nach dem Prozeduraufruf mit ElapsedMilliseconds() die Zeit messen. Dann weißt du, wie lange deine Prozedur für die Verarbeitung braucht.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Aufrufdauer einer Prozedur ermitteln

Beitrag von Thorium »

Genau mit ElapsedMilliseconds Startzeit vor dem Aufruf merken und nach beenden der Prozedur nochmal um die Endzeit zu ermitteln dann Endzeit - Startzeit.

Ganz wichtig bei solchen Messungen Debugger deaktivieren! Ansonsten können die Messergebnisse um mehrstellige Faktoren falsch sein.

Bei niedrigen Laufzeiten bietet sich auch an die Prozedur in einer Schleife mehrfach aufzurufen um die Messzeit zu verlängern. Ansonsten schlägt die Ungenauigkeit des OS-Timings zu. Z.B. wird im normalfall die Zeit nur um 12ms genau gemessen.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Aufrufdauer einer Prozedur ermitteln

Beitrag von STARGÅTE »

mit der Win-API QueryPerformanceCounter gehts noch ein bisschen genauer.
Damit kommt man bis auf einige Mikrosekunden:

Bei jedem MeasureTime() Aufrufe wird die Zeit bis zum nächsten Aufrufe gemessen und zurückgegeben in einer Größenordnung deiner Wahl (zB 1e6 für Mikrosekunden):

Code: Alles auswählen


Global QueryPerformanceFrequency.q : QueryPerformanceFrequency_(@QueryPerformanceFrequency)
Global QueryPerformanceCounter.q : QueryPerformanceCounter_(@QueryPerformanceCounter)

Procedure.d MeasureTime(Base.d=1.0)
	Protected Counter.q
	Protected MicroSeconds.d
	QueryPerformanceCounter_(@Counter)
	MicroSeconds = Base * (Counter-QueryPerformanceCounter) / QueryPerformanceFrequency
	QueryPerformanceCounter = Counter
	ProcedureReturn MicroSeconds
EndProcedure


;- Example

Procedure Test()
	Protected NewList Element.i()
	MeasureTime()
	For N = 1 To 1000
		AddElement(Element())
		DeleteElement(Element())
	Next
	MessageRequester("Time", "Time: "+StrF(MeasureTime(1e6))+" µs")
EndProcedure


Test()
---------------------------
Time
---------------------------
Time: 292.8444824219 µs
---------------------------
OK
---------------------------
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
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Aufrufdauer einer Prozedur ermitteln

Beitrag von Chimorin »

Heyho,

ich glaube, ich habe den Zeitschinder schon gefunden.
Ich hätte mir jetzt gedacht, dass es z.B. bei der Aufrufverfolgung noch eine Spalte gibt, wie lange es denn insgesamt gedauert hat (oder gleich Durchschnittlich), diese Prozedur aufzurufen. Mir geht es auch nicht um die genaue Zeit oder irgendeine Zeit, ich wüsste nur gern den langsamsten Part des Programmes.
Trotzdem Danke für eure Hilfe.
Bild

- formerly known as Bananenfreak -
Antworten