Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Optimierungsfragen zu Proceduren (https://www.delphipraxis.net/119257-optimierungsfragen-zu-proceduren.html)

mr_emre_d 23. Aug 2008 04:26


Optimierungsfragen zu Proceduren
 
Moin Moin

Guten Morgen liebe Leute :mrgreen:

Hier ein paar Fragen meinerseits:

Bei Procedureaufrufen wird z.B. sagen wir bei
Code:
procedure doBlub( var x:string ); ...
eine Referenz, also Speicheradresse ( Pointer -> 4 Byte :gruebel: )
übergeben !?

Nun würde ich gerne wissen,
1. Wie groß der param bei einer normalen Procedure ala
Code:
procedure doBlub( x: string ); ...
ist bzw wie sie verwendet wird und
2. Dasselbe wie Fr.1 nur mit const
Ich denke mal, dass Konstanten auch als eine (geschützte :gruebel: ) Referenz verwendet werden.

Welche Varianten sind schneller ? Bei dieser Frage gehts mir nur um die Geschwindigkeit ! Also nicht was genau die Procedure machen soll oder so !!!

Ich kann mir vorstellen, dass zb
Code:
procedure doBlub( x: byte); ...
schneller läuft, bzw läufen müsste, als eine Proc. mit const, bzw var Parametern, da ein Byte ja kleiner ist als wie ein Pointer !

Und es ist wahrscheinlich sinnvoller, wenn man einen Param. , nur wenn es größer als n Pointer ist,
auch als const deklariert !? Oder :gruebel:

Puh ... das wars einmal :)

Achja: Wäre auch schön, wenn ihr mir weitere Tipps geben könnt, wie man allgemein Programme optimiert !!!

MfG Franz :)

Bernhard Geyer 23. Aug 2008 06:43

Re: Optimierungsfragen zu Proceduren
 
Bei Strings/WideStrings beschleundigt die Parameterübergabe ein const. Bei Records ebenfalls. Bei Datentypen < 4 Byte ist es fraglich ob nicht die "krumheit" dieser Datentypen nicht Problematisch ist bei Prozessoren/Chipsätzen die Optimal mit auf 4, besser noch auf 8 Byte ausgerichtete Strukturen arbeiten können.

grenzgaenger 23. Aug 2008 10:16

Re: Optimierungsfragen zu Proceduren
 
bei call by value wird immer eine copie übergeben. das heisst i.d.r. mehr aufwand...

bei datenstrukturen, welche nicht auf das jeweilige prozessorregister optimiert sind (z.b. bei einer 8 bit maschine, mit einem 8 bit maschine, 1 int oder bei einer 16 bit maschine mit einem 16 bit compiler , 1 byte), kostet das dem prozessor meist zusätzliche taktzyklen.


bei call by reference, wird i.d.r. nur ein pointer auf die struktur übergeben, das war es. da es sich hierbei um die registergrösse handelt, mit der der prozssor am besten umgehen kann, beansprucht dies i.a.r. auch die wenigsten taktzyklen...

also, immer überlegen, ob man eine copie von einem datenbereich benötigt, und wie gross die daten denn wirklich sein sollen :-)

wenn man ein neues programm beginnt, sollte man i.d.r. immer die nativen datentypen verwenden, welche auf dem prozessor angepasst sind... da diese i.d.r. am performantesten ablaufen. hat aber den nachteil, dass man von compilerversion und/oder prozessor andere datengrössen mit dem datentypen abbilden kann...

Christian Seehase 23. Aug 2008 13:38

Re: Optimierungsfragen zu Proceduren
 
Moin Zusammen,

also ich habe da einen anderen Ansatz, wie ich entscheide welche Art von Parameter ich verwende.

const wird bei mir ein Parameter, wenn der Wert nur übergeben werden soll, var wenn die Prozedur den übergebenen Wert verarbeiten und ändern soll und out, wenn der Parameter nur als Rückgabewert dient.
Ein Sonderfall sind Objekte und Pointer. Hier nehme ich immer const, damit ich mir nicht versehentlich die Referenz innerhalb der Prozedur zerstöre, und ein Speicherleck erzeuge.
Für Wertparameter (also ohne const, var oder out) habe ich noch keine sinnvolle Anwendung gefunden.

sx2008 23. Aug 2008 14:55

Re: Optimierungsfragen zu Proceduren
 
Zitat:

Zitat von Christian Seehase
Für Wertparameter (also ohne const, var oder out) habe ich noch keine sinnvolle Anwendung gefunden.

Die gibt es aber in den Fällen, wo man einen Parameter vor der Weiterverarbeitung noch ändern muss:
Delphi-Quellcode:
// Variante A
procedure SaveIrgendwas(s:string);
begin
  s := Trim(s);
  if s <> '' then
     ....
end;

// Variante B
procedure SaveIrgendwas(const s:string);
var
  t : string;
begin
  t := Trim(s);
  if t <> '' then
     ....
end;
Ich würde auf jeden Fall die Variante A vorziehen.
Ansonsten bin ich mit allem anderen, was du geschrieben hast einig.

mr_emre_d 23. Aug 2008 16:18

Re: Optimierungsfragen zu Proceduren
 
OK, vielen dank !

Damit haben sich einige meiner Fragen geklärt :thumb:

Da solls noch etwas mit Inline geben ? ( nicht inline im sinne von assemble! )


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 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-2025 by Thomas Breitkreuz