Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: [Konzeptfrage] ist Listbox schneller zu durchsuchen?

  Alt 25. Sep 2008, 09:29
ListBox arbeitet intern mit einer Stringliste, es bringt also nichts, den Inhalt zu kopieren. Mit PosEx ist es sowieso viel schneller, denn der Bottleneck ist eindeutig die Verwendung von 'Copy'.

Ich habe den Code mal mit PosEx mit 20.000 Zeilen getestet (600k Text), Ohne Begin/EndUpdate, Suche direkt in der Listbox. Ergebnis: 200ms, um ein nicht existentes Wort in dem Text zu finden.

Dann habe ich den Text der Listbox vorher in einen String kopiert (fText := MyListBox.Items.Text). Das dauert 350ms. Dafür dauert das Suchen dann direkt in diesem String gemessene 0ms (also nicht meßbar).

Fazit: Wenn Du in einer sich nicht häufig ändernden Liste suchst, würde ich den Umweg über die Konvertierung in einen String gehen, sonst eben direkt in der Liste suchen (mit For-Schleife und PosEx).
Delphi-Quellcode:
procedure TForm1.btFindFirstClick(Sender: TObject);
begin
  fText := lb.items.text;
  fPos := 0;
  btSearchAgainClick(Sender);
end;


procedure TForm1.btFindAgainClick(Sender: TObject);
Var
  p,iLine,iCol : Integer;

  Procedure _CalcLineAndCol (aPos : Integer; Var aLine, aCol : Integer);
  Var
    i, iLineStart : Integer;

  Begin
    aLine := 1;
    For i:=1 to aPos do
      If Ftext[i]=#10 Then Begin
        iLineStart := i;
        inc(aLine);
        End;
    aCol := aPos - iLineStart;
  End;

begin
  p := csstrings.PosEx(edSearch.Text, fText,fPos+1);
  if p>0 Then Begin
    _CalcLineAndCol(p, iLine, iCol);
    lb.TopIndex := max(iLine-3, 1);
    fPos := p+Length (edSearch.Text)-1;
  End Else Raise Exception.Create('Suchstring nicht gefunden');
end;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat