Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#11

AW: Zeile aus Stringlist löschen, wie optimieren?

  Alt 14. Feb 2014, 13:36
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.

Geändert von Popov (14. Feb 2014 um 15:29 Uhr)
  Mit Zitat antworten Zitat