Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#11

Re: RichEdit.FindText beschleunigen

  Alt 1. Feb 2008, 19:38
Nein, Laufzeit-Fehler treten bei mir nicht auf.

Ich habe mir den Code jetzt genauer angesehen. Die von mir verlinkte Funktion FindTextAll() enthält genau die Bremse, vor der ich dich warnen wollte. Hier die korrigierte Fassung:

Delphi-Quellcode:
function FindTextAll(re: TRichEdit; const sText: string;
    options: TSearchTypes): TIntegerDynArray;
var
  iStart, iFound, iLength: Integer;
begin
  SetLength(Result, 0);
  iStart := 0;
  iLength := Length(re.Text); // re.Lines.Text war fatal
  while iStart < (iLength - Length(sText)) do
  begin
    iFound := re.FindText(sText, iStart, iLength - iStart, options);
    if iFound = -1 then Break;
    SetLength(Result, Succ(Length(Result)));
    Result[High(Result)] := iFound;
    iStart := iFound + Length(sText);
  end;
end;
Den Geschwindigkeitsvorteil ziehst du in deinem Code aus zwei fiesen Tricks: Du suchst immer nur nach dem ersten Treffer, weitere ignorierst du, und du verkleinerst den Suchbereich mit jedem Treffer. Wird ein Suchwort am Ende des Textes gefunden, dann beginnst du mit der Suche nach dem nächsten Suchwort direkt hinter dem vorigen Treffer. Dein Text enthält 34.630 Zeichen, insgesamt durchsucht werden bei dir 35.037 Zeichen. Bei etwa gleichmäßig im Text verteilten Suchwörtern müsstest du aber pro einfachem Treffer etwa 17.315 Zeichen untersuchen, bei 410 Durchläufen sind das etwa 7MB. Mein Code findet übrigens 483 Treffer.

Der Vergleich der beiden Lösungen hinkt ein wenig, meinst du nicht auch?
  Mit Zitat antworten Zitat