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
Benutzerbild von Mavarik
Mavarik

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

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.540 Beiträge
 
Delphi 12 Athens
 
#2

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
 
#3

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
 
#4

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
496 Beiträge
 
Delphi 12 Athens
 
#5

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
 
#6

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
496 Beiträge
 
Delphi 12 Athens
 
#7

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
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 22. Apr 2018, 07:41
Kleiner Bench Verbesserungs-Vorschlag
Delphi-Quellcode:
const
  amount = 1000000;
  attempts = 50;
var
  x,y: cardinal;
// tickstart, tickfinish: cardinal;
  ticks: cardinal; // eine variable genügt
// allcounts: cardinal;
  s: String;
begin
  Randomize; // einmal reicht, oder?
  SetLength(s, Random(255)); // lieber nur ein random um ein ein präziseres ergebniss zu erhalten, man will ja nicht random benchen
// allcounts := 0;
  for x := 1 to attempts do
  begin
    y := 1;
    ticks := GetTickCount;
// 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; // 0 + tickdifferenz
    ticks := GetTickCount - ticks;
  end;
// showmessage(inttostr((allcounts div attempts)));
  showmessage(inttostr((ticks div attempts)));
end;
Ich habe es noch nicht getestet aber so erscheint es mir logischer
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Procedure vs Function, Vor- und Nachteile

  Alt 22. Apr 2018, 08:26
Uhrzeit (GetSystemTime und Andere) - maximal Millisekunden
GetTickCount - meistens 15-16 Millisekunden
QueryPerformanceCounter - schnell, x Nanosekunden
RDTSC (Read Time-Stamp Counter) - schneller, es waren mal CPU-Ticks

TThread.GetTickCount - bestimmt GetTickCount
TStopwatch - QueryPerformanceCounter im Windows
(TPlatformServices.Current as IFMXTimerService).GetTick - QueryPerformanceCounter im Windows
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (22. Apr 2018 um 08:37 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
496 Beiträge
 
Delphi 12 Athens
 
#10

AW: Procedure vs Function, Vor- und Nachteile

  Alt 23. Apr 2018, 01:50
1. ist doch völlig belanglos, das Ergebis ist das gleiche
2. ich schrieb bereits dass der code nur hingerotzt ist. musste es sogar erstmal formatieren, damit es hier nicht ganz so peinlich rüberkommt
3. die meisten sachen (doppelte variablen, randomization bei jedem durchlauf, ...) waren schon so beabsichtigt, um das ergebnis möglichst repräsentativ zu halten und nicht zu verfälschen. Wenn du sie aber weglassen willst, tu das. Die Funktion wurde ja ursprünglich auch nicht für das hier geschrieben, sondern für was anderes...
Dennis
  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 13:57 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