![]() |
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...) |
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 |
Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
Zitat:
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. |
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" ??? |
Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
Zitat:
|
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:
Was nch meinen (beschränkten) Assemblerkenntnissen das Register ebp um eins erhöht ... aber was st das -$08 ?
inc dword ptr [ebp-$08]
|
Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
Zitat:
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. |
Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
Zitat:
Delphi-Quellcode:
PCardinal(EBP-$08)^
|
Re: Sqr(X) vs X*X, Inc(X) vs X:=X+1, ...
Zitat:
BTW, dizzy meinte was anderes. Dieser ASM-Befehl:
Code:
ist schneller als das:
INC AX
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* |
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 09:27 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