Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Konstantenparameter (https://www.delphipraxis.net/77717-konstantenparameter.html)

Cöster 23. Sep 2006 19:04


Konstantenparameter
 
Hi!

Sollte man in selbst deklarierten Methoden Konstantenparameter den anderen Parametern vorziehen?

Denn in der Delphi-Hilfe steht:
Zitat:

Die Verwendung von const ermöglicht dem Compiler die Optimierung des Codes für strukturierte und String-Parameter.
Bei der procedure Delay z.B. wäre es doch dann wahrscheinlich besser, die Millisekunden als Konstantenparameter zu deklarieren.

Deswegen wundert mich, dass an anderer Stelle in der Hilfe steht:
Zitat:

Die meisten Parameter sind Wert- (Standard) oder Variablenparameter (var).

Dax 23. Sep 2006 19:08

Re: Konstantenparameter
 
Grundsätzlich: Jein.

Wenn du Records oder Strings übergibst, die du nicht ändern willst, deklarier sie als const. Wenn du sie ändern musst, und die aufrufende Methode soll's mitkriegen, nimm var. Ansonsten: du hast wahrscheinlich was falsch gemacht und solltest dein Design überdenken :zwinker:

Für einfache Dinge wie Integer oder Byte machts weniger Sinn, auch wenn du Konstanten als Parameter übergeben willst, sehe von var/const ab. Wenn du allerdings viele Floats rumschiebst, kann es unter Umständen einen gewissen Geschwindigkeitsvorteil mit sich bringen - muss aber nicht.

Luckie 23. Sep 2006 19:09

Re: Konstantenparameter
 
Bei Parametern vom Typ String, die in der Methode nicht verändert wrden, ja. Zum einem, wegen der Optimierung und zum andrem erhöht es die Lesbarkeit, weil man sofort sieht, dass der Paramater nicht verändert wird.

Der_Unwissende 23. Sep 2006 19:15

Re: Konstantenparameter
 
Ich würde mal sagen, dass ein const nie schadet, oder? Also selbst wenn es überflüssig sein sollte, dürfte dies doch nichts verschlechtern.

Unabhängig davon hier auch gleich eine Frage zum gleichen Thema, weiß jmd. ob es nicht eh aut. eine Optimierung durch den Compiler gibt? Ich meine mich zu erinnern, dass z.B. der Java-Compiler einzelne Parameter eh als final übersetzt, wenn diese in einer Methode nicht geschrieben werden. Vielleicht hat ja der Delphi-Compiler hier eine ähnliche Optimierung, so dass auch das Fehlen keine Auswirkungen hat (sehen wir von der Lesbarkeit ab).

Zu dem Thema Lesbarkeit, dann sollte man doch auch noch out erwähnen, ist auch nochmal eindeutig und sinnvoll!

Gruß Der Unwissende

Cöster 24. Sep 2006 09:23

Re: Konstantenparameter
 
Zitat:

Zitat von Der_Unwissende
weiß jmd. ob es nicht eh aut. eine Optimierung durch den Compiler gibt?

Ich weiß es nicht, aber ich nehme an nicht. Denn sonst würde in der Hilfe ja nicht stehen, dass const dem Compiler die Optimierung des Codes ermöglicht (siehe Zitat in meinem ersten Beitrag).

Bernhard Geyer 24. Sep 2006 10:38

Re: Konstantenparameter
 
Zitat:

Zitat von Der_Unwissende
weiß jmd. ob es nicht eh aut. eine Optimierung durch den Compiler gibt?

Kann es auch nicht geben da sobald man mit Pointern weiterwerkelt (z.B. übergabe in eine DLL) den Const-Parameter verändert kann auch und damit das Programm durcheinander bringen kann.

const bringt immer eine Geschwindigkeitsoptimierung wenn der eigentliche Parameter mehr als 4 Byte (für Win32) benötigt. Dann wird statt einer kopie deines Parameters (String, Struktur, ...) nur eine Zeiger übergeben. Bei Objekten bringts nichts da ja sowieso nur eine Referenz übergeben wird und diese ist ja ein 4 Byte Zeiger.

Delphi-Laie 4. Aug 2011 15:51

AW: Re: Konstantenparameter
 
Das Thema interessierte mich so sehr, daß ich mich damit beschäftigte und hier trotz des Alters der Diskussion etwas dazu beitragen möchte:

Zitat:

Zitat von Der_Unwissende (Beitrag 528589)
weiß jmd. ob es nicht eh aut. eine Optimierung durch den Compiler gibt?

Anscheinend ja. Ich probierte es mit einem sehr langen String, der "einfachsten" Datenstruktur, die man sehr groß und damit sehr speicherbeanspruchend werden lassen kann. Solang in der aufgerufenen Prozedur die übergebene Variable nicht per Ergibtanweisung verändert wird, solang wird anscheinend auch kein Abbild der Datenstruktur erzeugt - zumindest läßt diese Folgerung der im Taskmanager angzeigte Speicherbedarf zu. Erst unmittelbar vor der Ergibtanweisung schnellt der Speicherbedarf in die Höhe, was auf ein unmittelbar zuvor erstelltes Duplikat der speicherbeanspruchenden Datenstruktur hindeutet.

Wenn man also die übergebene (in die Routine "hineinfließende") Variable nicht verändert, ist es demnach egal, ob man sie einfach oder mit const gegen Veränderung abgesichert übergibt.

Diese Beobachtung machte ich bereits mit Delphi 2.0 (und 3.0).

himitsu 4. Aug 2011 16:04

AW: Re: Konstantenparameter
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1115106)
Wenn man also die übergebene (in die Routine "hineinfließende") Variable nicht verändert, ist es demnach egal, ob man sie einfach oder mit const gegen Veränderung abgesichert übergibt.

Fast.

PS: Es gab vor Kurzem schonmal einen Thread dazu wo wild hin- und herdiskutiert und auch mal was gemessen wurde.

sirius 4. Aug 2011 16:11

AW: Konstantenparameter
 
Das hat einfach was mit der Referenzzählun zu tun. Es ist wie das Kopieren eines Strings. Beim Kopieren wird keine Zeit verloren, da eigentlich keine Kopie erstellt wird, sondern nur der Referenzzähler um eins erhöht wird, was ja recht fix geht.
Wenn man dann aber die Kopie (oder auch das Original) ändert startet Delphi den eigentlichen Kopiervorgang. Und erst jetzt wird es teuer.

Du beschreibst quasi das normal zu erwartende Verhalten, da brauch man auch keine Zeitmessungen etc für.

jaenicke 4. Aug 2011 16:14

AW: Konstantenparameter
 
@Delphi-Laie:
Es wird schon bei einer einfachen Zuweisung an eine andere Variable der Referenzzähler erhöht, während das bei einem const Parameter nicht passiert. Das kannst du im Assemblerquelltext sofort sehen. Deshalb werden zumindest einige CPU-Zyklen mehr gebraucht.

Mit welchem Quelltext hast du denn getestet?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.
Seite 1 von 2  1 2      

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