Profiling tool for Lazarus applications
-
- Beiträge: 1
- Registriert: Di 12. Nov 2024, 04:45
Profiling tool for Lazarus applications
Hallo zusammen,
Ich muss wissen, ob das Tool existiert und wo ich es finden kann. Ich brauche ein Profiling-Tool, das mit Lazarus-Anwendungen in der neuesten stabilen Version beider Lazarus-Versionen funktioniert.
LazProfile funktioniert nicht, das erste ist 5 Jahre alt und lässt sich nicht kompilieren, das zweite ist 14 Jahre alt und hat ein paar Paketfehler.
Ich habe versucht, die Anwendung mit Valgrind unter Linux auszuführen und dabei auch -gv in der Konsolen-App zuzulassen, aber Valgrind gibt einen Fehler aus, als ob die Anwendung nicht ausgeführt werden könnte.
Wir entwickeln ein Komponentenpaket, das im Vergleich zu seiner idealen Geschwindigkeitsspanne langsam ist, also brauche ich ein Tool, das mir hilft, herauszufinden, wo im Code die Verlangsamung auftritt.
Vielen Dank im Voraus
Ich muss wissen, ob das Tool existiert und wo ich es finden kann. Ich brauche ein Profiling-Tool, das mit Lazarus-Anwendungen in der neuesten stabilen Version beider Lazarus-Versionen funktioniert.
LazProfile funktioniert nicht, das erste ist 5 Jahre alt und lässt sich nicht kompilieren, das zweite ist 14 Jahre alt und hat ein paar Paketfehler.
Ich habe versucht, die Anwendung mit Valgrind unter Linux auszuführen und dabei auch -gv in der Konsolen-App zuzulassen, aber Valgrind gibt einen Fehler aus, als ob die Anwendung nicht ausgeführt werden könnte.
Wir entwickeln ein Komponentenpaket, das im Vergleich zu seiner idealen Geschwindigkeitsspanne langsam ist, also brauche ich ein Tool, das mir hilft, herauszufinden, wo im Code die Verlangsamung auftritt.
Vielen Dank im Voraus
-
- Beiträge: 1058
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Profiling tool for Lazarus applications
Benutzt ihr in eurem Komponentenpaket Threading?
Ich hatte in einem System mal die Situation dass mehrere Thread arbeiteten, jeder einzelne Thread aber weniger als 10 Millisekunden benötigte (z.B. 4ms). Trotzdem hat das Betriebssystem die 10 ms seiner Zeitscheibe gewartet (also zusätzliche 7ms).
Das dann multipliziert mit einigen laufenden Threads die auch noch synchronisiert werden mussten hat das die Durchlaufzeiten für einen Prozess drastisch erhöht.
Als Lösung haben wir dann das (Linux-) Betriebssystem mit einer Zeitscheibe von 1 ms kompiliert, dann hat es geklappt.
Ich hatte in einem System mal die Situation dass mehrere Thread arbeiteten, jeder einzelne Thread aber weniger als 10 Millisekunden benötigte (z.B. 4ms). Trotzdem hat das Betriebssystem die 10 ms seiner Zeitscheibe gewartet (also zusätzliche 7ms).
Das dann multipliziert mit einigen laufenden Threads die auch noch synchronisiert werden mussten hat das die Durchlaufzeiten für einen Prozess drastisch erhöht.
Als Lösung haben wir dann das (Linux-) Betriebssystem mit einer Zeitscheibe von 1 ms kompiliert, dann hat es geklappt.
Re: Profiling tool for Lazarus applications
Ich habe in Google, profiler Lazarus IDE eingehen und auf den ersten Blick einiges finden können. Wie gut die Ereignisse sind, kann ich allerdings nicht sagen.
Was vielleicht auch helfen kann, wenn man selbst die Zeit einer Funktion/Methode misst. Unter PHP beschäftige ich mich momentan etwas damit, indem ich eine Startzeit am Anfang der Funktion/Methode setze und es anschließend ausrechne.
Was vielleicht auch helfen kann, wenn man selbst die Zeit einer Funktion/Methode misst. Unter PHP beschäftige ich mich momentan etwas damit, indem ich eine Startzeit am Anfang der Funktion/Methode setze und es anschließend ausrechne.
Re: Profiling tool for Lazarus applications
Was ziemlich voraussetzunglos funktioniert, ist GetTickCount an Stellen, wo du das Problem vermutest.
Anschauen z.B. mit Ansicht -> Debuggerfenster -> Console In/Output
https://wiki.freepascal.org/LazLogger
Code: Alles auswählen
uses ... LazLogger;
...
procedure TForm1.Button1Click(Sender: TObject);
var Tick:Int64;
begin
Tick:=GetTickCount64;
Sleep(500);
DebugLn('1.Stelle: ', IntToStr(GetTickCount64-Tick),'ms');
Sleep(100);
DebugLn('2.Stelle: ',IntToStr(GetTickCount64-Tick),'ms');
Tick:=GetTickCount64; //Zurücksetzen
Sleep(50);
DebugLn('3.Stelle: ',IntToStr(GetTickCount64-Tick),'ms');
end;
https://wiki.freepascal.org/LazLogger
Re: Profiling tool for Lazarus applications
Das erste? das Zweite? Ich nehme an, der komplette Text wäre "LazProfiler/FpProfiler funktioniert nicht", so wie du im englischen Forum geschrieben hast.ramiroelliot hat geschrieben: Di 12. Nov 2024, 05:16 LazProfile funktioniert nicht, das erste ist 5 Jahre alt und lässt sich nicht kompilieren, das zweite ist 14 Jahre alt und hat ein paar Paketfehler.
LazProfiler habe ich ausprobiert. Ja, das Package kompiliert nicht, aber das ist einfach zu beheben, da die Umbenennung von TVirtualStringTree zu TLazVirtualXtringTree für den Lazarus-Fork von VirtualTreeView nicht eingearbeitet ist. Mache diese Änderung an allen Stellen, dir dir der Compiler zeigt, und das Package kompiliert. Trotzdem konnte ich anschließend eines meiner Projekte nicht profilieren, aber vielleicht hätte ich mich mehr damit befasen müssen.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Profiling tool for Lazarus applications
Ich hab mich ebenfalls damit beschäftigt.
Nachdem ich TVirtualStringTree durch TLazVirtualStringTree ersetzt und alle WriteLn(xxx) auskommentiert habe,
hat es compiliert und ich konnte es auch installieren.
Wenn ich dann ein Testprojekt profilieren wollte, kam eine Meldung, dass Resourcen vom Typ 'res' nicht unterstützt würden.
Da habe ich dann in LazProfilerAddOn.pas in Zeile 1178 nach dem erzeugen des Parsers die Zeile
eingefügt.
Jetzt kann ich unter Ansicht -> Profiler (Results and Configuration) das profilieren konfigurieren.
Nachdem ich Start -> Profiler angeklickt hab, wird mein Projekt compiliert und gestartet.
Nach der Ausführung ist aber im Profiler kein Ergebnis zu sehen.
Werd mal weiter forschen.
Nachdem ich TVirtualStringTree durch TLazVirtualStringTree ersetzt und alle WriteLn(xxx) auskommentiert habe,
hat es compiliert und ich konnte es auch installieren.
Wenn ich dann ein Testprojekt profilieren wollte, kam eine Meldung, dass Resourcen vom Typ 'res' nicht unterstützt würden.
Da habe ich dann in LazProfilerAddOn.pas in Zeile 1178 nach dem erzeugen des Parsers die Zeile
Code: Alles auswählen
pas.Options:=pas.Options+[po_IgnoreUnknownResource];
Jetzt kann ich unter Ansicht -> Profiler (Results and Configuration) das profilieren konfigurieren.
Nachdem ich Start -> Profiler angeklickt hab, wird mein Projekt compiliert und gestartet.
Nach der Ausführung ist aber im Profiler kein Ergebnis zu sehen.
Werd mal weiter forschen.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Profiling tool for Lazarus applications
Ich hab einen Branch gefunden, der direkt funktioniert.
Code: Alles auswählen
git clone https://github.com/seryal/LazProfiler.git
Re: Profiling tool for Lazarus applications
Ja, dieser Code (*) compiliert ohne weitere Veränderungen, aber auch hiere ist das Output-Fenster nach dem Ende des zu testenden Programms leer, bzw. zeigt nur eine Checkbox mit dem Programm-Namen an, und wenn ich die anklicke, habe ich eine Schutzverletzung...fliegermichl hat geschrieben: Di 12. Nov 2024, 15:58 Ich hab einen Branch gefunden, der direkt funktioniert.
(*) Leider hat der Autor in der Unit LazProfilerAddon die Schreibweise aller möglichen Parameter geändert, so dass man nicht sieht, wo die wesentlichen Änderungen sind. Kann man das git diff eigentlich dazu überreden, die Schreibweise zu ignorieren?
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Profiling tool for Lazarus applications
Also bei einem Mini Testprojekt hat es funktioniert und ich bekam auch eine Ausgabe. Wie oft wurde die Routine aufgerufen usw.
Bei meinem GLScene Testprojekt bekommt er die Instrumentalisierung nicht hin (oder ich bin zu ungeduldig)
Bei meinem GLScene Testprojekt bekommt er die Instrumentalisierung nicht hin (oder ich bin zu ungeduldig)