Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sqr(X) vs X*X, Inc(X) vs X:=X+1, ... (https://www.delphipraxis.net/64204-sqr-x-vs-x%2Ax-inc-x-vs-x-%3Dx-1-a.html)

glkgereon 28. Feb 2006 19:35


Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
Hi,

ich habe eine grundsätzliche Frage zum Delphi-Compiler...

es gibt ja einige Funktionen wie Sqr, Inc oder Dec, die eigentslich nahezu "überflüssig" sind...
will heissen, es geht sogar kürzer als der funktionsname (X:=Sqr(X);...X:=X*X;)

warum gibt es sie?

ist Sqr(X) generell schneller als X*X? ist es überhaupt "anders"?

wie sieht es bei Inc und Dec aus?
(auch Inc(X,%); und ähnliches...)

Dust Signs 28. Feb 2006 20:28

Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
Inc ist um einiges schneller als x := x + 1; Der Grund: was ist einfacher? Den Assemblerbefehl inc x (oder ähnlich; ist jetzt symbolisch zu verstehen) auszuführen, oder den Wert von x zu ermitteln, 1 zu addieren und das dann x zuzuweisen?

Dust Signs

dizzy 28. Feb 2006 20:33

Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
Zitat:

Zitat von Dust Signs
Inc ist um einiges schneller als x := x + 1; Der Grund: was ist einfacher? Den Assemblerbefehl inc x (oder ähnlich; ist jetzt symbolisch zu verstehen) auszuführen, oder den Wert von x zu ermitteln, 1 zu addieren und das dann x zuzuweisen?

Dust Signs

Das gilt jedoch wenn ich mich recht entsinne nicht mehr für Delphi, sondern eher für (Turbo-)Pascal. Damals war die Umsetzung von "inc(x)" und "x:=x+1" unterschiedlich, während der Delphi-Compiler diese trivialen Fälle durchaus erkennt und optimiert. Wenn ich das richtig im Hinterkopf habe, ist in Delphi "x:=x*x" sogar schneller als "x:=sqr(x)" (obwhol sqr() meine ich via Compilermagic realisiert ist, also keinen CALL bedingt).

Somit kann ich mir eigentlich nur vorstellen, dass diese Dinge der Abwärtskompatibilität wegen vorhanden sind. Und zumindest bei mir, wohl eher aus Gewohnheit, ist es so, dass ich ein "inc(x)" schneller lese als den entsp. Term.

jfheins 28. Feb 2006 20:35

Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
In meinem Delphi2005 wird inc(i) und i := i + 1; in den gleichen Assemblercode umgesetzt - selbst ohne optimierung ...

@dust sings: was sollte inc denn anderes machen ausser "den Wert von x zu ermitteln, 1 zu addieren und das dann x zuzuweisen" ???

dizzy 28. Feb 2006 20:40

Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
Zitat:

Zitat von jfheins
was sollte inc denn anderes machen ausser "den Wert von x zu ermitteln, 1 zu addieren und das dann x zuzuweisen" ???

Es gibt das Mnemonic "INC", dass ein Register um 1 erhöht.

jfheins 28. Feb 2006 20:44

Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
Genau das wird bei beiden Fällen erzeugt ;)

Um präzise zu sein, beides wird zu einem
Delphi-Quellcode:
inc dword ptr [ebp-$08]
Was nch meinen (beschränkten) Assemblerkenntnissen das Register ebp um eins erhöht ... aber was st das -$08 ?

dizzy 28. Feb 2006 20:50

Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
Zitat:

Zitat von jfheins
Genau das wird bei beiden Fällen erzeugt ;)



Um präzise zu sein, beides wird zu einem
Delphi-Quellcode:
inc dword ptr [ebp-$08]
Was nch meinen (beschränkten) Assemblerkenntnissen das Register ebp um eins erhöht ... aber was st das -$08 ?

Jau, hab ich ja oben auch geschrieben, dass das spätestens seit Delphi 5 (älteres hab ich net zum testen) so ist ;)
Das -$08 ist ein Offset. ebp wird in diesem Fall dereferenziert, also in ebp steht eine Speicheradresse (wenn ich mich nicht irre ist in ebp üblicherweise der Stackpointer). Nur soll hier nicht der Wert an [ebp] selbst, sondern 8 Bytes vorher inkrementiert werden. (Die [] sind der Dereferenzierungsoperator in asm; in Delphi dem ^ vergleichbar.)

\\edit: INC arbeitet offenbar nicht nur auf Registern, sondern auch im Speicher. Oben sprach ich nur von Registern...

\\edit2: das "dword ptr" ist im Grunde ein Cast. Es sagt der CPU, dass der an der folgenden Speicheradresse gefundene Wert als DWORD zu verstehen ist.

Dax 28. Feb 2006 20:53

Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
Zitat:

Zitat von jfheins
Was nch meinen (beschränkten) Assemblerkenntnissen das Register ebp um eins erhöht ... aber was st das -$08 ?

Puh, wie erklärt man das jemandem mit beschränkten Assemblerkenntnissen? ;) Stell dir EBP als ne Art Zeiger auf ne Position in einem Byte-Array vor, dann wäre [ebp-$08] in Delphi (symbolisch)
Delphi-Quellcode:
PCardinal(EBP-$08)^

alcaeus 28. Feb 2006 20:54

Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
Zitat:

Zitat von jfheins
Was nch meinen (beschränkten) Assemblerkenntnissen das Register ebp um eins erhöht ... aber was st das -$08 ?

Autsch. Erhoeht den Wert der Speicherzelle, die durch den Inhalt von ebp - 0x08 referenziert wird, um 1. 0x08 ist dabei der Offset.

BTW, dizzy meinte was anderes. Dieser ASM-Befehl:
Code:
INC AX
ist schneller als das:
Code:
ADD AX,1
;)

Darum gings glaube ich ;)

Greetz
alcaeus

Ich hoffe ich hab das bisschen ASM richtig...hab die Code-Table grad nicht zur Hand *g*

Chewie 28. Feb 2006 21:18

Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
 
Inc() ist nicht nur der abwärtskompatibilität wegen vorhanden!

Wenn man mit typiserten Zeigern arbeitet, kommt einem die Verwendung von Inc() sehr entgegen.
Denn Inc() nimmt neben Ganzzahlen solche Zeiger entgegen und inkrementiert die Adresse um ein Vielfaches der Größe des Datentyps, auf den der Zeiger zeigt. Man braucht also keinen Cast in Integer und dort eine Addition mit SizeOf().

Gleiches gilt auch für die Subtraktion mit Dec().


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 Uhr.

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