Einzelnen Beitrag anzeigen

mjenke

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

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