AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Procedure vs Function, Vor- und Nachteile
Thema durchsuchen
Ansicht
Themen-Optionen

Procedure vs Function, Vor- und Nachteile

Ein Thema von KodeZwerg · begonnen am 15. Apr 2018 · letzter Beitrag vom 23. Apr 2018
Antwort Antwort
Seite 3 von 4     123 4      
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
491 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Procedure vs Function, Vor- und Nachteile

  Alt 16. Apr 2018, 15:59
Wie schon richtig gesagt wurde, ist "var" mit "out" identisch.
Und beide sind wiederrum mit "const" funktionsweise identisch: Alles eine referenzbasierte Übergabe, im Grunde gleichbedeutend mit einem Zeiger. Lediglich "const" hat die besonderheit, dass der Compiler dem Programmierer den direkten Zugriff auf die Variable verbietet. Das lässt sich aber auch über ASM umgehen, wenn man es braucht (was nie der Fall sein sollte!). Auch werden "const"-Parameter bei String-Typen ein wenig optimiert (steht so zumindest im DocWiki), ansonsten verhält es sich aber intern exakt wie mit "var" oder "out".
Wer sich ebenfalls etwas mit ASM in Delphi auskennt, der weiß, dass das Ergebnis, genau wie der erste Parameter einer Funktion, bei 32-Bit immer im EAX-Register übergeben bzw. zurückgegeben wird. Strings und Records werden außerdem IMMER als Referenz übergeben. Insofern ist es völlig belanglos, welche dieser Routinen man benutzt, der Code ist in jedem Fall identisch:

procedure Foo(var X: Integer);

procedure Foo(out X: Integer);

procedure Foo(X: PInteger);

function Foo(const X: Integer): PInteger;
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Procedure vs Function, Vor- und Nachteile

  Alt 16. Apr 2018, 16:12
Strings und Records werden außerdem IMMER als Referenz übergeben. Insofern ist es völlig belanglos, welche dieser Routinen man benutzt, der Code ist in jedem Fall identisch:
Hier muss man schon aufpassen. Im Falle eines nicht-const/var/out Strings wird keine direkte Referenz übergeben, sondern lokal ein neuer mutable String erzeugt. Ansonsten würde man ja die übergebene Instanz modifizieren können - was definitiv unerwünscht ist. Auch im Falle von Record stimmt es NICHT, dass immer Referenzen übergeben werden. Das hängt mitunter z.B. von der Record-Größe ab. Selbst ein const garantiert hier nicht zu 100% Referenzen! Musste ich selbst noch die Tage nachlesen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Procedure vs Function, Vor- und Nachteile

  Alt 19. Apr 2018, 08:48
Kann es sein, dass Die Fragestellung nicht mehr im Vordergrund steht?


Beispiele
Delphi-Quellcode:
// Funktionen Vorteil, sie geben etwas direkt wieder
Function Beispiel : Boolean;
begin
  Result := True;
end;

// Proceduren können ja auch etwas wiedergeben per Var
// Nachteil, man benötigt eben eine Variable um das Var auszuwerten
Procedure Beispiel (var bResult: Boolean);
begin
  bResult := True;
end;
Aber was Unterscheidet die Beiden noch?
Die Frage ist : Wie willst Du das Ergebnis ansprechen. (Abgesehen von der "Var" Diskussion)

Beispiel:

Delphi-Quellcode:
var
  Person : TPerson;
  LHatAdresse : Boolean;
...
if Person.HatAdresse then oder
if TPerson.HatAdresse(Person) then oder
Delphi-Quellcode:
Person(LHatAdresse);
if LHatAdresse then
Wobei 1 und 2 eigentlich gleich sind besser vielleicht.

if TKunde.HatAdresse(Person) then weil der Vergleich nicht in TPerson sondern zentral im TKunden definiert ist.

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#4

AW: Procedure vs Function, Vor- und Nachteile

  Alt 19. Apr 2018, 09:21
[ref] ist einer von vielen Standardattributen, abgesehn davon, dass es hier als "Ausnahme" direkt an den Compiler gerichtet ist.
[weak] und [unsafe] wind auch ganz nett.
http://docwiki.embarcadero.com/RADSt...iler-Attribute

Ansonsten kann man fast Allem auch eigene Attribute zuweisen und per RTTI zur Laufzeit auslesen.
z.B. gern genommen für's Test-Management, wo man direkt an Methoden seine Testfunktionen und Testparameter hinterlegen kann.

Ich hab in meinen Libs mal spaßeshalber [Admin] und andere benötigte Privilegien an den Funktionen hintelegt.

Delphi-Quellcode:
// Proceduren können ja auch etwas wiedergeben per Var
// Nachteil, man benötigt eben eine Variable um das Var auszuwerten
Procedure Beispiel (var bResult: LongBool);
begin
  InterlockedExchange(Integer(bResult), Integer(True)); // neben der WinAPI gibt es inzwischen auch System.AtomicExchange
end;
Je nach Anforderung kann das aber auch wieder ein Vorteil sein, denn so könnte diese Prozedur threadsave in diese Variable schreiben.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Apr 2018 um 10:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Procedure vs Function, Vor- und Nachteile

  Alt 19. Apr 2018, 09:32
Kann es sein, dass Die Fragestellung nicht mehr im Vordergrund steht?
Das was mir bei Thread-Erstellung durch den Kopf geschossen ist war die Frage wie im Titel.
Zacherl hat da sofort die passende Antwort geliefert: "Ist Wurscht.". Damit wäre der Thread bereits geschlossen gewesen.
Ich wollte tatsächlich mehr über die Interna erfahren hauptsächlich wegen Perfomance und Speicher ob Delphi das anders handhabt je nach dem was ich einsetze (Procedure vs Function).
Auch der im Thread beschriebene 5% Boost gehören dazu, was ja nur aufgedeckt wurde nachdem man vom Thema abwich.
Für mich als Thread-Ersteller kann ich nur sagen das ich über Input, auch wenn nicht 100% zum Thema passend aber dennoch irgendwie damit zusammen hängen könnte, mich sehr freue und nach wie vor die DP-Admins bitte den Thread nicht gleich dicht zu machen wenn es nicht ganz exakt das Thema treffen mag.
Ich bin zwar dadurch zum Leser degradiert aber genau darum ging es mir, nach und nach ploppten mehr und mehr Dinge hoch wo ich absolut nicht mitreden kann aber Wissen anreichern kann nie Schaden.

Danke auch für Deine Beispiele!


Einen schönen sonnigen Donnerstag Wünsche ich Euch allen!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Procedure vs Function, Vor- und Nachteile

  Alt 19. Apr 2018, 09:57
AtomicDecrement und AtomicIncrement kannte ich bereits, AtomicExchange kenne ich noch nicht, Danke dafür!

edit
Erster Google-Treffer für "[ref] const Delphi":
Ja manchmal klappen bei mir auch die einfachsten Dinge nicht, Super Link dazu, Danke!
Gruß vom KodeZwerg

Geändert von KodeZwerg (19. Apr 2018 um 10:45 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
491 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Procedure vs Function, Vor- und Nachteile

  Alt 21. Apr 2018, 00:22
Auch der im Thread beschriebene 5% Boost gehören dazu
...was auch nur eine aus den Fingern gesaugte Zahl irgendeines Ultraprofis war. Einen Benchmark hat er dazu nicht geliefert, und ich habe sie dann mal so übernommen gehabt, da ich um ehrlich zu sein auch keine weiteren Nachforschungen diesbezüglich anstellen wollte. Aber wenn ich mir das Assembly von "oben" ansehe, dann wird es, je nach länge und Typ des Strings, durchaus mit Sicherheit deutlich über den willkührlich angenommenen "5%" liegen. Ich tippe da auf irgendwas zwischen 15 und 25% im Schnitt, den "const"-Aufrufe da rausholen können. Ist aber auch von mir hier nur eine Annahme, Belege habe ich dafür gerade nicht.
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Procedure vs Function, Vor- und Nachteile

  Alt 21. Apr 2018, 06:20
Moin moin zum Benchen hab ich für andere Beispiele das GetTick von Agner Fog genommen. Es kommt kein Zeitwert raus aber ein Wert mit dem man arbeiten kann. Getestet mit VAR OUT CONST hab ich es selbst noch nicht aber bei Bedarf kann ich es Nachreichen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
491 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Procedure vs Function, Vor- und Nachteile

  Alt 21. Apr 2018, 23:53
Moin moin zum Benchen hab ich für andere Beispiele das GetTick von Agner Fog genommen. Es kommt kein Zeitwert raus aber ein Wert mit dem man arbeiten kann. Getestet mit VAR OUT CONST hab ich es selbst noch nicht aber bei Bedarf kann ich es Nachreichen.
...was nicht notwendig ist, denn man hat ja immer die GetTickCount-Routine von Windows. Diese ist in der RTL schön gewrappt und abrufbar. Hab mir da so ein schönes stückchen Code gebastelt, das im grunde für fast alles anwendbar ist und mit dem ich für jede beliebige Routine ohne viel Anpassarbeit immer die Performance Ablesen kann. Das, auf diesen Fall zugeschnitten, sieht bei mir dann so aus:

Delphi-Quellcode:
const
  amount = 1000000;
  attempts = 50;
var
  x,y: cardinal;
  tickstart, tickfinish: cardinal;
  allcounts: cardinal; s: String;
begin
  allcounts := 0;
  for x := 1 to attempts do
  begin
    y := 1;
    tickstart := GetTickCount;
    while y <= amount do
    begin
      Randomize;
      SetLength(s, Random(255));
      //entw Foo(s);
      //oder FooC(s);
      //oder FooV(s);
      inc(y);
    end;
    tickfinish := GetTickCount;
    allcounts := allcounts + tickfinish - tickstart;
  end;
  showmessage(inttostr((allcounts div attempts)));
end;
Ja, ich weiß, Code qualität und Formatierung zum Kotzen, aber darauf kommt es hier idF mal nicht an.
Was hier geschieht, kurz und Knackig: Es wird eine der drei Routinen 1000000 mal hintereinander aufgerufen und von diesen Aufrufen die insgesamte Zeit (Ticks) gemessen. Das ganze wird 50 mal ausgeführt, und das Endergebnis am Ende durch 50 geteilt. So hat man einen Durchschnittswert, der auf 50 Versuchen basiert, und die Zeit für 1000000 Aufrufe widergibt. Der String besitzt immer eine Zufallslänge zwischen 0 und 255, die vor jedem Funktionsaufruf neu ausgewürfelt wird.

Die Testroutinen waren für die Erste Versuchsreihe wie folgt deklariert:

Delphi-Quellcode:
procedure Foo(S: String);
begin

end;

procedure FooC(const S: String);
begin

end;

procedure FooV(var S: String);
begin

end;
Die Ergebnisse waren beeindruckend, wenn man es so beschreiben will:
  • Für Foo(s): 77 Ticks je 1000000 Aufrufe im Schnitt
  • Für FooC(s): 48 Ticks je 1000000 Aufrufe im Schnitt
  • Für FooV(s): 48 Ticks je 1000000 Aufrufe im Schnitt

Nun habe ich Statt Unicode- Ansi-Strings genommen. Der Benchmark lief wie folgt ab:
  • Für Foo(s): 74 Ticks je 1000000 Aufrufe im Schnitt
  • Für FooC(s): 50 Ticks je 1000000 Aufrufe im Schnitt
  • Für FooV(s): 50 Ticks je 1000000 Aufrufe im Schnitt

Bei ShortString, so dachte ich mir, könne man sogar noch mehr Performance herausholen. So testete ich dies ebenfalls:
  • Für Foo(s): 64 Ticks je 1000000 Aufrufe im Schnitt
  • Für FooC(s): 39 Ticks je 1000000 Aufrufe im Schnitt
  • Für FooV(s): 39 Ticks je 1000000 Aufrufe im Schnitt

Es scheint, als dass in den meisten Fällen, die bei zufälligen Stringlängen generiert wurden, "const" und "var" sich identisch verhalten, oder zumindest eine identische Performance besitzen. Hervorstechen tut ganz klar Foo, und zwar im negativen Sinne.

Im allgemeinen kann man grob geschätzt sagen, dass sich mit "const" die Performance bei UnicodeStrings (um 37,7%), bei AnsiStrings (um 32,4%), sowie bei ShortStrings (um 39,1%) steigern lässt. Verallgemeinert lässt sich hier eine Tendenz von etwas über einem Drittel im Schnitt feststellen. Zwischen "var" und "const" konnte in dieser Testreihe kein merklicher Unterschied festgestellt werden. Ich gehe davon aus, dass dies nur bei genauerer bestrachtungsweise der String-Länge passieren kann. Darauf, das zu überprüfen, habe ich aber im Augenblick leider keinen Bock, weshalb die Fragestellung hier offen bleibt. Evtl kann ja jemand anderes hier aushelfen...?
Dennis

Geändert von Dennis07 (21. Apr 2018 um 23:57 Uhr)
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
558 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Procedure vs Function, Vor- und Nachteile

  Alt 21. Apr 2018, 08:56
Ein Unterschied zwischen Prozedur und Funktion musst du dir aus den Fingern saugen.

Ich habe mir das Thema noch mal angeschaut. In letzter Konsequenz einen schlampigen Programmierstil zu verhindern schafft man nicht konsequent und die Zeiten zu denen es genügte Stati einer Domänenlogik von technischen Return Codes abzutrennen sind vorbei. Dieser Zugang kommt aus der Zeit vor Exceptionhandling.

In C hast du das noch und damit werden Einflüsse dieses Zugangs nicht wirklich verschwinden. Die Länge des Kaiser's Bart erkennt man an den Seiten voller Beiträge in der Regel.


Hallo, der Titel ist ja recht Aussagekräftig

Falls sich jemand hier einklinkt und Antwortet, Danke dafür!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 21:13 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