Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - programm schlanker machen


klausiemausie - So 08.02.09 09:59
Titel: programm schlanker machen
so nun endlich habe ich mein programm fertig, aber es verbraucht zu viel arbeitsspeicher, nämlich über 400 mb ram, das is für so ein relativ kleines programm sehr viel. worauf sollte man denn achten, bzw. was sollte man ändern, um den speicherverbrauch zu senken?
gruss klaus


Gausi - So 08.02.09 10:15

Naja, das kommt ganz darauf an, was dein Programm so macht. Hast du viele große Bilder drin? Gibst du zwischendurch benötigten Speicher wieder frei? Hast du evtl. viele Konstrukte der Form Setlength(MeinArray, length(MeinArray) + 1) drin, die sehr oft aufgerufen werden?


klausiemausie - So 08.02.09 10:37

viele bilder habe ich drin, aber das sind alles pngs, die nich grösser sind als 10 kb oder so. arrays hab ich einige drin ja, aber von speicherfreigabe weiss ich nichts, wie macht man das, wie gehts das, diese struktur die du da angegeben hast, hab ich nicht verwendet in meinem programm


Gausi - So 08.02.09 10:46

PNG oder JPG ist völlig egal - wenn du die Bilder lädst, in ein Image z.B., dann sind das (oft) intern Bitmaps und verbrauchen entsprechend viel Platz.

Speicher freigeben: Ganz grob muss zu jedem Create auch ein Free in deinem Code vorkommen.


uko - So 08.02.09 10:47

Du mußt jedes Objekt, das Du erzeugst auch wieder freigeben. Sonst bleibt der Speicher dafür bis zum Programmende einfach reserviert.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
myObject := TMyObject.Create; // Speicher für myObject wird reserviert
try
 //mach wasmit myObject
finally
  myObject.Free;  // Speicher wird wieder freigegeben
end;

Einfachster Weg: aktuelle Version von FastMM manuell einbinden und die Überwachung des Speicherverbrauchs einschalten. Dann kriegst Du schon gesagt, wo Du Speicher nicht freigibst :-)

Außerdem schau mal nach so Sachen wie:

Delphi-Quelltext
1:
2:
var
  myarray = array[0..1000000of double;


(sprich nach vordefinierten arrays großer Dimension. Wenn Du sie nicht wirklich in der Dimension brauchst, dann sind meistens die dynamischen Arrays die bessere Wahl)

Grüße,
Uli


klausiemausie - So 08.02.09 11:58

hm gut liegt bestimmt daran, dass alle meine über 30 forms am anfang per create form geladen werden, nur eben nicht angezeigt werden, wie löse ich denn das am galantesten? ich könnte ja in der projektunit das alles rausmachen, bloss wie schreibe ich dass dann in die einzelnen units, wenn eine neue form aufgerufen werden soll, dass die dann geladen wird, und wenn die wieder beendet wird, dass die dann halt ganz verschwindet?


Gausi - So 08.02.09 12:46

Du nimmst zuerst die genzen Nebenformen aus den automatisch erzeugten heraus (in den Projektoptionen). Und überall da, wo du ein

Delphi-Quelltext
1:
NebenForm.Show; // oder ShowModal                    
aufrufst, schreibst du sowas:

Delphi-Quelltext
1:
2:
3:
if Not Assigned(NebenForm) then
    Application.CreateForm(TNebenForm, NebenForm);
NebenForm.Show;


klausiemausie - So 08.02.09 13:39

ah gut, und wie schreib ich dann dass das fenster wieder verschwindet und der speicher freigegeben wird?


jaenicke - So 08.02.09 14:49

Setz im OnClose des Formulars Action auf caFree, dann wird dieses beim Schließen aus dem Speicher entfernt.

user profile iconklausiemausie hat folgendes geschrieben Zum zitierten Posting springen:
hm gut liegt bestimmt daran, dass alle meine über 30 forms am anfang per create form geladen werden
Aber 30 Formulare? Selbst Projekte von mir, die nicht die allerkleinsten sind, haben deutlich weniger. Z.B. hat eines bei dem ich gerade geschaut habe 94 Units und ca. 45.000 Zeilen Quelltext, aber nur 14 Formulare.

Bist du sicher, dass du das nicht auf weniger zusammenfassen kannst? Machen die Formulare wirklich alle vollkommen verschiedene Sachen?

Die Speicherverwendung wird aber vermutlich eher an Multimediainhalten liegen, ob wie bereits angesprochen Bilder oder andere Sachen.