AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von glkgereon · begonnen am 28. Feb 2006 · letzter Beitrag vom 28. Feb 2006
Antwort Antwort
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

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

  Alt 28. Feb 2006, 20:35
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...)
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#2

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

  Alt 28. Feb 2006, 21:28
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
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 28. Feb 2006, 21:33
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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

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

  Alt 28. Feb 2006, 21:35
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" ???
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 28. Feb 2006, 21:40
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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

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

  Alt 28. Feb 2006, 21:44
Genau das wird bei beiden Fällen erzeugt

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

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 28. Feb 2006, 21:50
Zitat von jfheins:
Genau das wird bei beiden Fällen erzeugt



Um präzise zu sein, beides wird zu einem 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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#8

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

  Alt 28. Feb 2006, 21:53
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)
PCardinal(EBP-$08)^
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#9

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

  Alt 28. Feb 2006, 21:54
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*
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#10

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

  Alt 28. Feb 2006, 22:18
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().
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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