Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#6

Re: Optimierung von, IP-Addresse auf Gültigkeit überprüfen

  Alt 10. Jan 2010, 11:35
ja, die '0.0.0.0' hab ich glatt übersehn

Delphi-Quellcode:
function isIP(const ipString: String; ip: PCardinal = nil): Boolean;
var
  pIpString: PChar;
  octetCount, octetSum, octetLen, octet: Integer;
begin
  Result := False;
  pIpString := PChar(ipString);
  octetCount := 0;
  octetSum := 0;
  while pIpString^ <> #0 do
  begin
    Inc(octetCount);
    octetLen := 0;
    octet := 0;
    while pIpString^ in ['0'..'9'] do
    //while IsDigit[pIpString^] do
    begin
      octet := octet * 10 + (Ord(pIpString^) - Ord('0'));
      Inc(octetLen);
      Inc(pIpString);
    end;
    octetSum := octetSum shl 8 or octet;
    if (octetLen = 0) or (octetLen > 3) or (octet > 255) then Exit;
    if octetCount = 4 then Break;
    if pIpString^ <> '.then Exit;
    Inc(pIpString);
  end;
  Result := (octetCount = 4) and (octetSum <> 0) and (pIpString^ = #0);
  if Result and Assigned(ip) then ip^ := octetSum;
end;
(Wie rum werden eigentlich die Werte ausgelesen? Nicht, daß hier die "ip" in der falschen Bytefolge vorliegt)

Aber das mit der Lookuptabelle:
Bei Astats "Versuchsaufbau" brachte diese auch nur 0,2% Geschwindigkeitszuwachs,
dagegen werden ab D2009 64 KB mehr Speicher in den gloablen Variablen belegt.

Und da in einem Programm, wo man diese Funktion nutzt, bestimmt mehr anderer "langsamerer" Code ausgeführt wird, als durch diese Optimierung gewonnen wurde, fällt dieses fast garnicht auf.
> Man kann also diese Optimierung einbauen, aber merklich verbessern wird sich dadurch wohl nichts

Code:
Unit2.pas.50: while pIpString^ in ['0'..'9'] do
00461B5D 0FB730           movzx esi,[eax]
00461B60 8BCE            mov ecx,esi
00461B62 83C1D0           add ecx,-$30
00461B65 6683E90A        sub cx,$0a
00461B69 72E1             jb $00461b4c


Unit2.pas.51: while IsDigit[pIpString^] do
00461B59 0FB708           movzx ecx,[eax]
00461B5C 80B9A8B1460000   cmp byte ptr [ecx+$0046b1a8],$00
00461B63 75E6             jnz $00461b4b
PS:
[DCC Warnung] Unit2.pas(33): W1050 WideChar in Set-Ausdrücken auf ByteChar verkürzt. Ziehen Sie die Verwendung der Funktion 'CharInSet' aus der Unit 'SysUtilsin Betracht. dieses kann man hier glatt ignorieren


PSS:
Delphi-Quellcode:
procedure InitIsDigit;
var
  C : char;
begin
  For C := '0to '9do IsDigit[C] := True;
end;
(die ganzen False werden ja durch die Initialisierung der Globalen gesetzt)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat