Hallo liebe Delphi-Praxis Mitglieder.
Ich suche nach Optimierungsmöglichkeiten für unten stehenden Code.
Die Funktion soll schnellstmöglich überprüfen, ob die eingegebene
IP Addresse gültig ist.
Die untenstehende Routiene arbeitet derzeit am schnellsten.
Habe diverse Socket-
API's und Regular-Expressions versucht, sind aber allesammt nicht schnell genug.
Hat dazu jemand eine Idee, wie man das Teil beschleunigen kann, bin auch für Vorschläge andere Konzepte dankbar.
Danke im Voraus, lg. Astat
Delphi-Quellcode:
function IsIP(s: string): Boolean;
var
s1, s2, s3, s4: String;
e, v, i, j: Integer;
bcLen: integer;
ix: array[1..3] of integer;
begin
result := false;
bcLen := Length(s);
if (bcLen > 15) or (bcLen < 7) then EXIT;
if s = '0.0.0.0' then EXIT;
j := 0;
for i:= 1 to bcLen do begin
if s[i] = '.' then begin
inc(j);
ix[j] := i;
end;
end;
if j <> 3 then EXIT;
s1 := copy(s, 1, ix[1] - 1);
s2 := copy(s, ix[1] + 1, ix[2] - ix[1] - 1);
s3 := copy(s, ix[2] + 1, ix[3] - ix[2] - 1);
s4 := copy(s, ix[3] + 1, bcLen);
Val(s1, v, e);
if (e <> 0) or (v > 255) then EXIT;
Val(s2, v, e);
if (e <> 0) or (v > 255) then EXIT;
Val(s3, v, e);
if (e <> 0) or (v > 255) then EXIT;
Val(s4, v, e);
if (e <> 0) or (v > 255) then EXIT;
result := true;
end;
var
Start: DWORD;
i: integer;
b: boolean;
begin
Start := GetTickCount;
for i := 0 to 1000000 do begin
b := IsIP('0.1.2.3');
b := IsIP('255.255.255.255');
b := IsIP('1.1.1.255');
b := IsIP('0.0.0.0');
b := IsIP('555.3.2.1');
b := IsIP('555.3.xyz');
b := IsIP('1.b.1.1');
b := IsIP('a');
b := IsIP('');
b := IsIP('1.0.0.0');
b := IsIP('10.73.10.108');
b := IsIP('0.0.1.0');
b := IsIP('0.1.1.0');
b := IsIP('1.0.0.0');
end;
writeln(IntToStr(GetTickCount - Start));
end.