Erfahrungsgemäß ist die größte Spaß/Performancegrenze (meistens) sowas wie
MyString := MyString + Character
Ersetze das durch:
Delphi-Quellcode:
SetLength (MyString, AMaxLength+1);
iLength := 0;
While Text[i] in aAllowedChars Do begin
inc (iLength);
MyString[iLength] := Text[i];
inc(i);
If (iLength > aMaxLength) and (aMaxLength > 0) Then Break;
End;
Weiterhin solltest Du deine optimalen Min/Max-Längenangaben anpassen: So benötigst Du immer vier Abfragen, statt 2.
Statt
Delphi-Quellcode:
if ((AMinLength = 0) or (iLength >= AMinLength)) and ((AMaxLength = 0) or (iLength <= AMaxLength)) then
aWords.Append(aWord);
Am Anfang:
If aMaxLength=0 Then aMaxLength = MaxInt;
Und dann
If (iLength>=aMinLength) And (iLength<=aMaxLength) Then aWords.Append(aWord);
Auf 'aMinLength=0' musst Du nicht prüfen.
Dann vereinfacht sich die innere Schleife zu:
Delphi-Quellcode:
SetLength (MyString, AMaxLength+1);
iLen := 0;
While (Text[i] in aAllowedChars) And (iLen<=aMaxLength) Do begin
inc (iLen);
MyString[iLen] := Text[i];
inc(i);
End;
So ist dann mein Vorschlag:
Delphi-Quellcode:
procedure ExtractWords(const AText: string; AMinLength, AMaxLength: Integer;
AAllowedChars: SetOfChar; AWords: TStrings);
var
i, iLength, TextLength: Integer;
sWord : string;
begin
If aMaxLength=0 Then aMaxLength = MaxInt;
AWords.BeginUpdate;
try
AWords.Clear;
i := 0;
TextLength := Length(AText);
while i < TextLength do begin
Inc(i);
if Text[i] in aAllowedChars then begin
SetLength (MyString, AMaxLength+1);
iLength := 0;
repeat
inc (iLength);
MyString[iLength] := Text[i];
inc(i);
until (iLength > aMaxLength) or (not (Text[i] in aAllowedChars))
if (iLength >= aMinLength) And (iLength <= aMaxLength) Then
aWords.Append(aWord);
end;
end;
finally
AWords.EndUpdate;
end;
end;
Getippt und nicht getestet.
Imho gehts noch schneller durch Verwendung von PChar und dynamischen Arrays statt einer TStringList.