Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion optimieren (https://www.delphipraxis.net/100778-funktion-optimieren.html)

xtZ 3. Okt 2007 21:11

Re: Funktion optimieren
 
Hi alzaimar,

Deine Methode ist zwar sehr schnell, aber sie funktioniert (bei mir) nicht. :?
Hab das "InitComparison" im Formcreate Ereignis eingefügt und die procedure ersetzt und es kommt immer als Result "False" raus.

//Edit:
Habs, du hattest ein "not" vor FraudChars vergessen.

x000x 4. Okt 2007 01:10

Re: Funktion optimieren
 
Moin moin,
die Zuweisung zu L kann doch weggelassen werden...
Delphi-Quellcode:
//..
  if Length(s) <> 32 then
  begin
    Result := False;
    Exit;
  end;
  for i := 1 to 32 do
//..

WS1976 4. Okt 2007 06:28

Re: Funktion optimieren
 
Hallo Dax,
dieser Ausdruck ist falsch. Die Bedingung zum Rausfliegen ist schon erfüllt wenn c ausserhalb '0' bis '9' liegt.
Delphi-Quellcode:
    if (c <= '0' and c >= '9') or (c <= 'A' and C >= 'F') or (c <= 'a' and c >= 'f') then
Grüsse
Rainer

alzaimar 4. Okt 2007 06:49

Re: Funktion optimieren
 
Hi xtZ,

Hier nochmal eine Zusammenfassung (Fehler bereinigt, Optimierungen der Anderen eingebaut):
Delphi-Quellcode:
Var
  FraudChars : Array [Char] Of Boolean;

Procedure InitComparison;
Var
  c : Char;

Begin
  For c:=low(Char) To High (Char) Do FraudChars[c] := True;
  for c:='0' to '9' do FraudChars[c] := False;
  for c:='a' to 'f' do FraudChars[c] := False;
  for c:='A' to 'F' do FraudChars[c] := False;
End;

function TestFunc(const s: String): Boolean; Inline;
var
  i : Integer;
 
begin
  Result := True;
  if Length(s) <> 32 then
    Result := False
  else for i := 1 to 32 do
    If FraudChar [s[i]] Then Begin
      Result := False;
      Break;
    end;
  end;
end;

WS1976 4. Okt 2007 08:11

Re: Funktion optimieren
 
Hallo,
so verstehts auch jeder:

Delphi-Quellcode:
function TestFunc(const s: String): Boolean; Inline;
var
  i : Integer;
 
begin
  Result := True;
  if Length(s) <> 32 then
    Result := False
  else
    for i := 1 to 32 do
       If FraudChar [s[i]] Then
          Begin
            Result := False;
            Break;
          end;
end;
Grüsse
Rainer

alzaimar 4. Okt 2007 08:13

Re: Funktion optimieren
 
Zitat:

Zitat von WS1976
so verstehts auch jeder

Stimmt. Dank Deiner professionellen Hilfe ist aus meinem Amateurgefrickel endlich lesbarer Code geworden. :zwinker:

Wobei man ja geteilter Meinung über die Formatierung sein kann, gelle?

Sidorion 4. Okt 2007 08:28

Re: Funktion optimieren
 
Richtig, alzimar. Das Einzige, was man vielleicht noch anders schreiben kann/möchte/sollte/haben/sein wäre diese Ecke:
Delphi-Quellcode:
  if Length(s) <> 32 then
    Result := False
Ich würde entweder die Anweisung hinten ans Then anhängen, oder das Then vor die Anweisung runterziehen, damit in 5 Jahren keiner auf die Idee kommt, da noch was hinzufrickeln.
Delphi-Quellcode:
  if Length(s) <> 32 then Result := False
// oder
  if Length(s) <> 32 
  then Result := False
@ws1976: nich böse sein, aber bei Deiner Schreibweise würde ich nie wissen, ob jetzt genügend ends da sind und wenn ja, ob sie an der richtigen Stelle sitzen.

RavenIV 4. Okt 2007 09:04

Re: Funktion optimieren
 
Zitat:

Zitat von Sidorion
Richtig, alzimar. Das Einzige, was man vielleicht noch anders schreiben kann/möchte/sollte/haben/sein wäre diese Ecke:
Delphi-Quellcode:
  if Length(s) <> 32 then
    Result := False

Wenn dann aber schon so:
Delphi-Quellcode:
if Length(s) <> 32 then
begin
  Result := False;
end { if Length(s) }
else
begin
  for i := 1 to 32 do
  begin
    if FraudChar [s[i]] then
    Begin
      Result := False;
      Break;
    end; { if FraudChar }
  end; { for i }
end; { else if Length(s) }

OldGrumpy 4. Okt 2007 09:08

Re: Funktion optimieren
 
Ein kleines Quentchen (JA, alte Rechtschreibung, das Wort hat wohl überhaupt nichts mit Quant zu tun :P) kann man wohl noch einsparen indem man sich die Zuweisung "Result:=True" am Anfang spart und nur ausführt wenn die Länge passt, da ansonsten eh gleich wieder Result:=False gesetzt wird. Also ab damit in den Else-Zweig :)

xaromz 4. Okt 2007 09:15

Re: Funktion optimieren
 
Hallo,

wenn wir schon dabei sind, Zuweisungen zu vermeiden, dann gleich richtig:
Delphi-Quellcode:
function TestFunc(const s: String): Boolean; Inline;
var
  i: Integer;
begin
  Result := False;
  if Length(s) = 32 then
  begin
    for i := 1 to 32 do
       if FraudChar [s[i]] then
         Exit;
    Result := True;
  end;
end;
Wobei es hier ja um Geschwindigkeit geht, und die Zuweisung von Result das eax-Register blockiert. Deshalb sollte Result eigentlich nur am Ende der Funktion gesetzt werden. Das darf aber jemand anderes machen...

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz