AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [Konzeptfrage] ist Listbox schneller zu durchsuchen?
Thema durchsuchen
Ansicht
Themen-Optionen

[Konzeptfrage] ist Listbox schneller zu durchsuchen?

Ein Thema von juergen · begonnen am 24. Sep 2008 · letzter Beitrag vom 26. Sep 2008
 
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
 


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 05:12 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