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; try finally myObject.Free; 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..1000000] of 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
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.
klausiemausie hat folgendes geschrieben : |
| 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!