Also löschen dauert wirklich lange, kopieren fast nichts. Ich hab ein Beispiel erstellt mit etwa 1 Mio Daten, davon 10% Leerzeilen. Erstellung etwa 150 ms, Löschung etwa 2 min, Kopiervorgang etwa 100 ms. Also statt löschen der Leerzeilen vielleicht besser kopieren der anderen Zeilen.
Hier das Beispiel mit dem ich gerechnet habe:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
txt = 'qwertzuiopüasdfghjklöäyxcvbnm';
var
sl, sl2: TStringList;
i, t: Integer;
t1, t2: TTime;
begin
sl := TStringList.Create;
sl2 := TStringList.Create;
try
//--- 1 Mio. Daten mit etw 10% Leerzeilen erstellen / Dauer etwa 150 ms
t1 := Now;
Cursor := crHourGlass;
for i := 1 to 1000000 do
if Random(10) = 1 then sl.Add('') else sl.Add(txt);
Cursor := crDefault;
t2 := Now;
t := MilliSecondsBetween(t1, t2);
ShowMessage(Format('Count sl: %d | Dauer der Erstellung: %d ms', [sl.Count, t]));
//--- 10% Daten (leerzeilen) entfernen / Dauer etwa 120000 ms
{
t1 := Now;
Cursor := crHourGlass;
for i := (sl.Count - 1) downto 0 do
if sl[i] = '' then sl.Delete(i);
Cursor := crDefault;
t2 := Now;
t := MilliSecondsBetween(t1, t2);
ShowMessage(Format('Count sl: %d | Dauert des Löschvorgangs: %d ms', [sl.Count, t]));
}
//--- 90% Daten (ohne leerzeilen) kopieren / Dauer etwa 300 ms
{ }
t1 := Now;
Cursor := crHourGlass;
sl2.Capacity := sl.Count;
for i := 0 to sl.Count - 1 do //korrigiert <<<<<<<<<<<<<
if sl[i] <> '' then sl2.Add(sl[i]);
sl.Assign(sl2);
sl.Capacity := sl.Count; //Korrektur nach unten
Cursor := crDefault;
t2 := Now;
t := MilliSecondsBetween(t1, t2);
ShowMessage(Format('Count sl: %d | Dauer des Kopiervorgangs: %d ms', [sl.Count, t]));
finally
sl2.Free;
sl.Free;
end;
end;
//EDIT: sorry, habe beim optimieren in letzter for Schleife downto statt to geschrieben. Die Ergebnisse bleiben aber.
//EDIT2: Apropos Speicher, Capacity sollte am Ende wieder korrigiert werden.