Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi heruasfinden ob zahl Gerade oder ungerade ist (https://www.delphipraxis.net/28516-heruasfinden-ob-zahl-gerade-oder-ungerade-ist.html)

Stefan Hueg 10. Sep 2004 00:01

Re: heruasfinden ob zahl Gerade oder ungerade ist
 
Kann ich bestätigen,

Code:
if GanzeZahl and 1 = 1 then //ungerade
else; //gerade
ist wesentlich schneller (doppelt so schnell) wie die Mod-Methode.

Luckie 10. Sep 2004 00:04

Re: heruasfinden ob zahl Gerade oder ungerade ist
 
Kann jemand mal in den Sourcen gucken, wie es Delphi-Referenz durchsuchenOdd macht?

negaH 10. Sep 2004 00:12

Re: heruasfinden ob zahl Gerade oder ungerade ist
 
Delphi-Quellcode:
if Zahl and 1 <> 0 then ;
entspricht dem Odd, und ist auch das schnellste.

Delphi-Quellcode:
if Zahl and 1 = 1 then ;
beinhaltet in Assembler einen Vergleich eines Registers mit einer Zahl die im Speicher steht, somit wesentlich ineffizienter.

Nutze ODD() dafür ist es da, und auch optimiert.


Delphi-Quellcode:
if Zahl mod 2 <> 0 then ;
ist in fakt identisch wie Odd(), kann also niemals langsammer sein.

Gruß Hagen

PS: Halbwissen ist schlechter als Unwissen.

himitsu 10. Sep 2004 00:14

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

Luckie 10. Sep 2004 00:18

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.

Nothine 10. Sep 2004 00:21

Re: heruasfinden ob zahl Gerade oder ungerade ist
 
Zitat:

Zitat von Luckie
Wieso? Wenn ich die Sourcen habe (Prof oder höher), dann sollte mnan es auch in der System.pas finden.

außer es ist compiler-magic, was in diesem falle wohl zutreffen dürfte...

negaH 10. Sep 2004 00:21

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:
if Odd(Zahl) then ;
ensteht ein Branch, ein bedingter Sprung in Assembler.

Delphi-Quellcode:
asm
  AND   EAX,1
  JZ    @NichtOdd


@NichtOdd:
end;
Delphi-Quellcode:
if Zahl and 1 = 1 then ;
würde dagegen so aussehen

Delphi-Quellcode:
asm
   AND EAX,1
   CMP EAX,1
   JNE @NichtOdd

@NichtOdd:
end;
Odd() selber wird aber als Magic unterschiedlich nach Assembler umgesetzt, zB.

Delphi-Quellcode:
Result := Odd(Zahl);
würde im besten Falle so aussehen

Delphi-Quellcode:
AND EAX,1
könnte aber auch so ausehen

Delphi-Quellcode:
AND   EDX, 1
SETNZ AL
je nach Optimierung des Compiliers und den Vorrausetzung der benutzen Register.

Gruß hagen

Luckie 10. Sep 2004 00:23

Re: heruasfinden ob zahl Gerade oder ungerade ist
 
Ui. Schon wieder was gelernt. Danke Hagen.

negaH 10. Sep 2004 00:25

Re: heruasfinden ob zahl Gerade oder ungerade ist
 
Zitat:

@negaH
meines ist schneller (der Vergleich mit 1 ist entfallen)
nein ist es nicht,
1.) sagte ich schon das ich niemals bei solchen Boolschen Auswertungen es so schreiben würde

Delphi-Quellcode:
if Flag and 1 = 1 then;
if Flag and $80 = $80 then ;
sondern immer

Delphi-Quellcode:
if Flag and 1 <> 0 then ;
if Flag and $80 <> 0 then ;
weil ich eben weis das das Assemblertechnisch ein großer Unterschied ist, und

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

Stefan Hueg 10. Sep 2004 00:33

Re: heruasfinden ob zahl Gerade oder ungerade ist
 
Zitat:

Zitat von negaH
Zitat:

@negaH
meines ist schneller (der Vergleich mit 1 ist entfallen)
Gruß Hagen

Doch ist es, habe es bei 100.000.000 Vergleichen getestet, die Variante mit "if Zahl and 1 = 1" ist um den Faktor 2 schneller als die Variante "if Zahl mod 2 = 1".


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 Uhr.
Seite 2 von 3     12 3      

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