Zitat von
Dax:
Das sollte (denke ich) schneller sein,
Nö, eher langsamer.
Zitat von
Dax:
da es die Set-Behandlung umgeht, die sich intern auf vergleichsweise riesige Datenstrukturen stützt. Wie Delphi deinen Code genau umsetzt, weiß ich allerdings nicht.
Findest Du 8 Bytes pro Set 'riesig'?
Ich finde das hier (getestet, ca 2x) schneller:
Delphi-Quellcode:
Var
FraudChars : Array [Char] Of Boolean;
Procedure InitComparison;
Var
c : Char;
Begin
FillChar (FraudChars, SizeOf(FraudChars),0);
for c:='0' to '9' do FraudChars[c] := True;
for c:='a' to 'f' do FraudChars[c] := True;
for c:='A' to 'F' do FraudChars[c] := True;
End;
function TestFunc(const s: String): Boolean; Inline;
var
i, l: Integer;
c: char;
begin
Result := True;
l := Length(s);
if l <> 32 then
begin
Result := False;
Exit;
end;
for i := 1 to l do
begin
If FraudChar [s[i]] Then Begin
Result := False;
Break;
end;
end;
end;
Du musst einmalig eine Lookuptabelle erstellen ('InitComparison') und dann diese verwenden. Alternativ kannst Du natürlich das Array als 'CONST' deklarieren.
Lookuptabellen sind eigentlich immer schneller (eigentlich = Ausnahmen bestätigen die Regel).
Bei solchen Problemen ist es immer wieder interessant, die Dinge auszutesten, weil man mit den Überlegungen häufig daneben liegt.