AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Freigabe von Objekten zeitaufwändig?
Thema durchsuchen
Ansicht
Themen-Optionen

Freigabe von Objekten zeitaufwändig?

Ein Thema von mjenke · begonnen am 9. Aug 2010 · letzter Beitrag vom 31. Aug 2010
Antwort Antwort
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#1

AW: Freigabe von Objekten zeitaufwändig?

  Alt 11. Aug 2010, 08:47
@himitsu:

Natürlich habe ich anfangs auch mal brav immer das erste Objekt aus dem Array freigegeben, den Rest nach vorne verschoben und dann das Array verkleinert. Das hatte ich aber irgendwann selbst schon gefunden und mich fleißig geschämt

Tatsächlich lief das Zerstören so ab, dass ich immer das letzte Objekt des Arrays zerstöre und dann das Array verkleinere.

while Last do Drop.Free; Wobei Last eine Funktion einer Container-Klasse ist, von der sich all meine Container ableiten. Sie aktiviert den letzten Eintrag des Arrays (setzt einen Positionszeiger) und liefert True, wenn Einträge vorhanden sind, bzw. False wenn nicht.

Delphi-Quellcode:
function TMyContainer.Last: Boolean;
begin
  Result := Length ( FEntries ) > 0;
  if Result then FPosition := High ( FEntries );
end;
Drop liefert den aktiven Eintrag des Arrays und entfernt ihn gleichzeitig aus dem Array (wobei alle nachstehenden vorgezogen werden, was nicht allzu dramatisch ist, wenn ohnehin der letzte Eintrag aktiv war).

Delphi-Quellcode:
function TMyContainer.Drop: TObject;
var
  i, j: Integer;
begin
  Result := nil;
  if FPosition <> -1 then begin
    for i := FPosition to High ( FEntries ) do begin
      if i = FPosition then Result := FEntries[i]
      else FEntries[i-1] := FEntries[i];
    end;
    SetLength ( FEntries, High ( FEntries ) );
    if Length ( FEntries ) = 0 then FPosition := -1
    else if FPosition > High ( FEntries ) then FPosition := High ( FEntries );
  end;
end;
Auf Deine Anregung hin gebe ich in einer Prozedur DestroyAllObjects nun alle verwalteten Objekte frei und setze dann die Array-Größe auf 0.

Delphi-Quellcode:
procedure TMyContainer.DestroyAllObjects;
var
  i: Integer;
begin
  for i := 0 to High ( FEntries ) do FEntries[i].Free;
  SetLength ( FEntries, 0 );
  FPosition := -1;
end;
Das bringt mir immerhin mit meinen Testdaten eine Zeitersparnis von beinahe 30 Minuten ein. Statt der 75-80 Minuten brauchte meine Anwendung heute morgen nur 49 Minuten.

Vielen Dank für den Hinweis!!!


Matthias
Matthias Jenke

Geändert von mkinzler (11. Aug 2010 um 12:32 Uhr) Grund: Code-Tags durch Delphi-Tags ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#2

AW: Freigabe von Objekten zeitaufwändig?

  Alt 11. Aug 2010, 08:56
Kleine Änderung, die gleich mal 40% einsprat
(Welches bei wenigen freizugebenden Objekten ja fast garnicht auffällt, sich aber in der Masse schon fast als expotentielle Auswirkungen zeigt)

Nun müßte man nur noch die anderen Bremsen finden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

AW: Freigabe von Objekten zeitaufwändig?

  Alt 11. Aug 2010, 09:00
Das klingt jetzt ein bisschen nach Quick 'n Dirty programmierung, aber wenn die Anwendung beendet wird, brauche ich doch eigentlich den Speicherplatz gar nicht mehr freigeben?
ich weiß dass das ein Speicherleck ist, aber wenn die Anwendung danach eh von Windows weggefegt wird ... ?

Etwas anderes ist es natürlich, wenn da irgendwelche Netzwerkressourcen oder so exklusiv gesperrt sind.

Okay, um auch etwas anderes ins Spiel zu bringen: Wäre es möglich, dass viel Speicher reserviert wird, aber nur wenig gebraucht? Sodass dann vll. der unbenutzte Speicher auf die Festplatte ausgelagert wird, und das beim Freigeben lange dauert?

Geändert von jfheins (11. Aug 2010 um 09:04 Uhr)
  Mit Zitat antworten Zitat
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#4

AW: Freigabe von Objekten zeitaufwändig?

  Alt 11. Aug 2010, 12:31
@jfheins:

Dieses Freigeben passiert während der Laufzeit immer mal wieder. Es gibt Grenzen, an denen ich neue Bearbeitungsschritte einleite und dabei erstmal alles aufräume, was ich nicht mehr brauche. Übrigens handelt es sich nicht um Speicherlecks, denn die habe ich in tagelanger Kleinarbeit gemeinsam mit einem Kollegen aufgestöbert und eliminiert. Alle Objekte, die erzeugt werden, werden auch wieder freigegeben. Ansonsten würde die Anwendung es gar nicht mehr schaffen, bis zum Ende durchzuarbeiten - hatten wir leider alles schon
Matthias Jenke
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

AW: Freigabe von Objekten zeitaufwändig?

  Alt 11. Aug 2010, 13:49
Okay, dann sit die Quick n Dirty Lösung natürlich nicht optimal...

hast du schonmal daran gedacht, einen Profiler mitlaufen zu lassen?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz