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.
Aufrufdauer einer Prozedur ermitteln
Re: Aufrufdauer einer Prozedur ermitteln
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.
Re: Aufrufdauer einer Prozedur ermitteln
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.
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!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

Re: Aufrufdauer einer Prozedur ermitteln
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):
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- 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
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.
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.

