![]() |
Re: heruasfinden ob zahl Gerade oder ungerade ist
Kann ich bestätigen,
Code:
ist wesentlich schneller (doppelt so schnell) wie die Mod-Methode.
if GanzeZahl and 1 = 1 then //ungerade
else; //gerade |
Re: heruasfinden ob zahl Gerade oder ungerade ist
Kann jemand mal in den Sourcen gucken, wie es
![]() |
Re: heruasfinden ob zahl Gerade oder ungerade ist
Delphi-Quellcode:
entspricht dem Odd, und ist auch das schnellste.
if Zahl and 1 <> 0 then ;
Delphi-Quellcode:
beinhaltet in Assembler einen Vergleich eines Registers mit einer Zahl die im Speicher steht, somit wesentlich ineffizienter.
if Zahl and 1 = 1 then ;
Nutze ODD() dafür ist es da, und auch optimiert.
Delphi-Quellcode:
ist in fakt identisch wie Odd(), kann also niemals langsammer sein.
if Zahl mod 2 <> 0 then ;
Gruß Hagen PS: Halbwissen ist schlechter als Unwissen. |
Re: heruasfinden ob zahl Gerade oder ungerade ist
@Luckie
das geht wohl nicht ... wenn ich die Deklaration davon suchen laß, dann lande ich in der System.pasund da ist natürlich nicht's zufinden -.- Aber es wird wohl so aussehn ^^
Delphi-Quellcode:
function Odd(X: Longint): Boolean;
begin Result := Boolean(X and $01); end; [ADD] @negaH meines ist schneller ;) (der Vergleich mit 1 ist entfallen) [EDIT] sch*** Schreibfehler |
Re: heruasfinden ob zahl Gerade oder ungerade ist
Wieso? Wenn ich die Sourcen habe (Prof oder höher), dann sollte mnan es auch in der System.pas finden.
|
Re: heruasfinden ob zahl Gerade oder ungerade ist
Zitat:
|
Re: heruasfinden ob zahl Gerade oder ungerade ist
nein wird es nicht, Odd() ist ein Compiler-Magic und muß direkt im Source anaylsiert werden. In den meisten Fällen wie eben
Delphi-Quellcode:
ensteht ein Branch, ein bedingter Sprung in Assembler.
if Odd(Zahl) then ;
Delphi-Quellcode:
asm
AND EAX,1 JZ @NichtOdd @NichtOdd: end;
Delphi-Quellcode:
würde dagegen so aussehen
if Zahl and 1 = 1 then ;
Delphi-Quellcode:
Odd() selber wird aber als Magic unterschiedlich nach Assembler umgesetzt, zB.
asm
AND EAX,1 CMP EAX,1 JNE @NichtOdd @NichtOdd: end;
Delphi-Quellcode:
würde im besten Falle so aussehen
Result := Odd(Zahl);
Delphi-Quellcode:
könnte aber auch so ausehen
AND EAX,1
Delphi-Quellcode:
je nach Optimierung des Compiliers und den Vorrausetzung der benutzen Register.
AND EDX, 1
SETNZ AL Gruß hagen |
Re: heruasfinden ob zahl Gerade oder ungerade ist
Ui. Schon wieder was gelernt. Danke Hagen.
|
Re: heruasfinden ob zahl Gerade oder ungerade ist
Zitat:
1.) sagte ich schon das ich niemals bei solchen Boolschen Auswertungen es so schreiben würde
Delphi-Quellcode:
sondern immer
if Flag and 1 = 1 then;
if Flag and $80 = $80 then ;
Delphi-Quellcode:
weil ich eben weis das das Assemblertechnisch ein großer Unterschied ist, und
if Flag and 1 <> 0 then ;
if Flag and $80 <> 0 then ; 2.) vergisst du das du eine externe Funktion nutzt die einen CALL + RET usw. benötigt, Odd() selber benutzt ist ein Compiler-Magic den der Compiler abhängig von den Randbedinungen immer anders in Asssembler umsetzt.Der Compiler wählt dann in jedem Falle den optimlasten und effizientesten Assembler, ganz im Gegensatz zu deiner Funktion. Sie beschränkt in diesem Falle die Wahlfreiheit des Optimierers. Gruß Hagen |
Re: heruasfinden ob zahl Gerade oder ungerade ist
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz