Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Programm wird mit Laufzeit immer langsamer (https://www.delphipraxis.net/207338-programm-wird-mit-laufzeit-immer-langsamer.html)

norwegen60 15. Mär 2021 11:41

Programm wird mit Laufzeit immer langsamer
 
Hallo zusammen,

ich weiß, dass ich hier eine ziemlich offen Frage stelle, aber ich weiß im Moment nicht so recht wo ich ansetzen soll.

Ich habe eine Anwednung die während der Laufzeit per RS232 Daten von einem Gerät abfragt, in die Datenbank schreibt, laufende Messergebnisse in zwei Charts darstellt und ein Teil der Daten in einem VirtualStringTree darstellt.
Nun besteht das Problem, dass die Anwendung nach 2 Tagen Laufzeit 2..3 s benötigt um z.B. nach Klick auf einen Button Daten per RS232 abzufragen. Nach dem Click erscheint die Windows-Sanduhr und 2..3 sec später sieht man die Daten am Splitterkabel, das ich zu Überwachungszwecken an die RS232 gehängt habe. Die Antwortzeit des Geräts selber liegt im ms-Bereich. Nach 4 Tagen Laufzeit sind es schon 5..6 s. Das Öffnen des Explorers geschieht normal. Es ist nur mein Programm, das langsamer wird
  • Alle 5s werden Temperatur, Drehzahl und Status abgefragt.
  • Alle 2 Minuten werden diese in einem Chart dargestellt und in DB geschrieben.
  • Alle 60 Minuten werden 8 Messwerte erfasst. d.h. nach 2 Tagen hat man 48 solcher Messpunkte. Es sind also keine großen Datenmengen, die da anfallen.
  • Zu Testzwecken habe ich den 60 Min-Intervall auf 4Min verringert. D.h. jetzt sind die Messungen nach 4h abgearbeitet => Kein Problem mit der Laufzeit => Es liegt wohl nicht daran, dass die Messpunkte ein Datenloch erzeugen
  • Ich habe die 2 Minuten logs abgeschalten => Nach 2 Tagen ist Anwendung wieder langsam => Es liegt wohl auch nicht am Log der 2-Minuten Daten
  • Ich habe die Darstellung in den Charts deaktiviert => Keine Verbesserung
  • Ich habe den Speicherverlauf geloggt. GetMemSpace erhöht sich nach 2.5 Tagen von 26'100 auf 26'327 kByte und M.dwAvailVirtual verringert sich von 1'582'312 auf 1'576'936 kByte => Erscheint mir auch nicht auffällig

Delphi-Quellcode:
function GetMemSpace: Integer;
// *****************************************************************************************************************************************
// Emittelt den Speicherbedarf der aktuellen Anwendung
var
  State: TMemoryManagerState;
  i: Integer;
begin
  GetMemoryManagerState(State);
  Result := 0;
  for i := 0 to high(State.SmallBlockTypeStates) do
    Inc(Result, State.SmallBlockTypeStates[i].AllocatedBlockCount * State.SmallBlockTypeStates[i].UseableBlockSize);
  Inc(Result, State.TotalAllocatedMediumBlockSize + State.TotalAllocatedLargeBlockSize);
end;
   
    // Alle 10 Minuten loggen (60 x 5s)
    if (Tag = (Tag div 12) * 12) then
    begin
      M.dwLength := SizeOf(M);
      GlobalMemoryStatus(M);
      GetLogger.Debug('MemLog', format('Used Memory = %11.0n / %14.0n kB', [GetMemSpace / 1024, M.dwAvailVirtual / 1024]));
    end;
Jetzt fehlt mir eine Idee was ich noch machen kann, um herauszufinden, warum die Anwendung im Verlauf von Tagen langsamer wird.

Programm ist mit Delphi XE erstellt

Danke für jede Hilfe
Gerd

Der schöne Günther 15. Mär 2021 12:40

AW: Programm wird mit Laufzeit immer langsamer
 
Zitat:

Zitat von norwegen60 (Beitrag 1485146)
Jetzt fehlt mir eine Idee was ich noch machen kann, um herauszufinden, warum die Anwendung im Verlauf von Tagen langsamer wird.

Einen "Profiler" verwenden, denn genau dafür wurden die erfunden. Gib einfach mal "Delphi Profiler" in die Suchmaschine deines Vertrauens ein, es gibt auch mehrere kostenlose Lösungen.

hoika 15. Mär 2021 12:47

AW: Programm wird mit Laufzeit immer langsamer
 
Hallo,
Zitat:

laufende Messergebnisse in zwei Charts darstellt und ein Teil der Daten in einem VirtualStringTree darstellt.
Dann nimm mal genau diesen Code testweise raus.
Oder stell nur die letzten 100 Mess-Ergebnisse dar.

Zweiter Ansatzpunkt ist die Datenbank.
Wohin speicherst Du die Mess-Ergebnisse?
Erfolgt die GUI-Darstellung nach:
1. neue Daten hintendran
oder
2. GUI verwerfen, alle Daten neu laden und anzeigen

norwegen60 15. Mär 2021 12:50

AW: Programm wird mit Laufzeit immer langsamer
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1485149)
Einen "Profiler" verwenden, denn genau dafür wurden die erfunden. Gib einfach mal "Delphi Profiler" in die Suchmaschine deines Vertrauens ein, es gibt auch mehrere kostenlose Lösungen.

:oops: Ich benutze hin und wieder den MsSQL-Profiler. Habe aber nicht realisiert, dass es sowas "natürlich" auch für die Delphi-Seite gibt.

Danke

norwegen60 15. Mär 2021 12:53

AW: Programm wird mit Laufzeit immer langsamer
 
Zitat:

Zitat von hoika (Beitrag 1485152)
Dann nimm mal genau diesen Code testweise raus.
Oder stell nur die letzten 100 Mess-Ergebnisse dar.

Ich hatte ja geschrieben, dass ich genau das schon gemacht habe. Temperatur und Drehzahl, wo überhaupt mehr als 100 Messpunkte anfallen, habe ich ganz abgeschalten. Bei den Intervall-Messungen nur die Chartdarstellung. Beides ohne Erfolg.

Ich probiere den Compiler

WiPhi 15. Mär 2021 12:56

AW: Programm wird mit Laufzeit immer langsamer
 
Wenn du via TCP/IP direkt oder via VPN zugriff auf das System hast, wäre ggf. auch noch Remote-Debugging via PA-Server eine Möglichkeit, die Stelle zu finden, welche den Performance-Einbruch verursacht.

himitsu 15. Mär 2021 13:50

AW: Programm wird mit Laufzeit immer langsamer
 
Von Bei Google suchenAQTime ist beim Delphi eine kostenlose Edition dabei (GetIt), aber nur die etwas kränkliche IDE-Integration.

Die wichtigsten Funktionen loggen/messen kannst auch selber.
GetTickCount, TStopwatch oder Dergleichen.

Beim Befüllen von Komponenten sind so Dinge wie BeginUpdate bzw. DisableControls beachtet?

norwegen60 15. Mär 2021 15:22

AW: Programm wird mit Laufzeit immer langsamer
 
Zitat:

Zitat von himitsu (Beitrag 1485167)
Von Bei Google suchenAQTime ist beim Delphi eine kostenlose Edition dabei (GetIt), aber nur die etwas kränkliche IDE-Integration.

Die wichtigsten Funktionen loggen/nessen kannst auch selber.
GetTickCount, TStopwatch oder Dergleichen.

Beim Befüllen von Komponenten sind so Dinge wie BeginUpdate bzw. DisableControls beachtet?

Wie gesagt ist es Delphi XE. Da gabs noch kein GetIt. Ich schau mir gerade AsmProfiler und SamplingProfiler an.

BeginUpdate und DisableControls sind beachtet, sollten hier aber kaum eine Rolle spielen, da kaum Daten gemessen werden. Da gibt es andere Methoden wo alle 3 Minuten gemessen wird und das über 1.5 Tagen. Da merkt man kaum was.

himitsu 15. Mär 2021 15:32

AW: Programm wird mit Laufzeit immer langsamer
 
Damals gab es noch das "manuelle" GetIt und die Additional-DVDs :stupid:

https://edn.embarcadero.com/article/41296

TomyN 15. Mär 2021 16:40

AW: Programm wird mit Laufzeit immer langsamer
 
Ich würde auf den TVirtualStringList tippen.

'Primitives' Profiling geht auch mit TimeGetTime...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz