Thema: Delphi IsPowerOfTwo

Einzelnen Beitrag anzeigen

Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#9

Re: IsPowerOfTwo

  Alt 7. Mai 2009, 11:06
@himitsu:
Oben hast du Performancemäßig ja noch genau einen ASM-Befehl rausoptimiert.

Jetzt mit deiner Methode zur Prüfung auf negative Zahlen hast du bis zu 7 ASM-Befehle unnötig reingbracht.

Hier mal meine Lösung, die Performancemäßig am besten war:
Delphi-Quellcode:
function IsPowerOfTwoInl(const Value: Cardinal): Boolean; inline;
begin
  Result := (Value > 0) and (Value and (Value -1) = 0);
end;
//...
var
  value: Cardinal;
begin
  isPow2 := IsPowerOfTwoInl(value);
end;
Dieses ergibt 11 ASM-Befehle, wobei durch optimale Jumps minimal 6 Befehle durchlaufen werden.


Wenn man jetzt negative Zahlen testen will, soll man folgendes machen:
Delphi-Quellcode:
//...
var
  value: Integer;
begin
  isPow2 := IsPowerOfTwoInl(Abs(value));
end;
Diese ergibt 14 ASM-Befehle, wobei durch optimale Jumps minimal 7 Befehle durchlaufen werden.
(Dabei habe ich die standard Delphi abs()-Funktion genommen.)


Also negaH´s Funktion ist schon sehr schnell, wer aber noch mehr will, der sollte "inline" hinten dran hängen.
  Mit Zitat antworten Zitat