AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Was ist schneller, Funktion oder Prozedure?
Thema durchsuchen
Ansicht
Themen-Optionen

Was ist schneller, Funktion oder Prozedure?

Ein Thema von Angel4585 · begonnen am 28. Okt 2005 · letzter Beitrag vom 29. Okt 2005
Antwort Antwort
Seite 2 von 4     12 34      
bigg
(Gast)

n/a Beiträge
 
#11

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 15:46
Ist eine Prozedur nicht eine Funktion,
bei der der Rückgabewert immer #0 ist?
  Mit Zitat antworten Zitat
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#12

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 15:52
Zitat:
nach 100.000.000 ist wieder die Funktion vorne...
Bei meinen test ist immer die Funktion vorne.
Du kannst ja danach den ermittelten Wert nochma teilen.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 15:52
@Angel4585: Besser so, sonst misst du ja fast nur die Laufzeit von QueryPerformanceCounter und nicht von deiner Funktion/Prozedur

Delphi-Quellcode:
var
  lol,lol2: Int64;
  i: Integer;
const anz = 1000000 ;
begin
  QueryPerformanceCounter(lol);
  for i:= 1 to anz do
   begin
   xx(v);
   end;
  QueryPerformanceCounter(lol2);
  Label1.Caption := FloatToStr((lol2-lol)/anz );

  QueryPerformanceCounter(lol);
  for i:= 1 to anz do
   begin
   v:=y;
   end;
  QueryPerformanceCounter(lol2);
  Label2.Caption := FloatToStr((lol2-lol)/anz );
end;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 15:55
ach die misst sich selber auch mit?? ist ja besch...

schönes WE zusammen
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#15

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 16:01
Zitat von Angel4585:
die ja beide glaube ich das selbe machen
Jein. Da kommt die Optimierung des Delphicompilers ins Spiel. Wie du vielleicht weißt, repräsentieren Variablen normalerweise Speicherzellen im RAM. Wenn ich also eine Zuweisung wie "erg := 2" habe, dann wird eine bestimmte Speicheradresse, die für "erg" reserviert wurde, mit dem Wert 2 gefüllt. Nun können Speicherzugriffe allerdings relativ viel Zeit kosten, da der Hauptspeicher ziemlich viel langsamer ist als modernen Prozessoren. Deshalb sollte man Speicherzugriffe wenn möglich vermeiden.

Prozessoren haben eigene kleine Speicherbereiche, die sogenannten Register. Kann man sich als Variablen vorstellen, die direkt in der CPU integriert und daher sehr schnell sind. Delphi-Variablen werden deshalb wann immer möglich auf Register abgebildet und nicht auf Speicherzellen im RAM.

Je nachdem wie der Kontext deines Programms nun aussieht, ist es möglich, dass "erg" auf ein Register abgebildet wird. In dem Fall wäre ein Funktionsaufruf à la "erg := y" vorzuziehen, denn dabei muss kein Speicherzugriff getätigt werden, das Funktionsergebnis wird einfach und schnell von Register zu Register kopiert (falls überhaupt).

Durch einen "var" Parameter dagegen erzwingst du sogar, dass die Variable, die als Parameter übergeben wird, im Speicher liegt und kein Register sein kann. D.h. selbst wenn dein Programmabschnitt vom Compiler so optimiert werden könnte, dass "erg" immer in einem Register gehalten werden kann und nie in den Speicher geschrieben werden muss, macht ein Prozeduraufruf à la "x(erg)" diese Optimiertungsmöglichkeit zunichte und verursacht, dass "erg" auf jeden Fall eine Speichervariable wird.

Allerdings dürften die Unterschiede so gering ausfallen, dass es sich eigentlich nicht lohnt, sich darüber den Kopf zu zerbrechen.
Aber natürlich ist es immer interessant zu wissen, wie das ganze eigentlich intern abläuft. Wenn man z.B. eine Funktion deklariert, deren Rückgabewert nicht sinnvoll in Registern gehalten werden kann, dann baut der Delphicompiler das automatisch in eine Prozedur mit var Parameter um. So wird z.B. aus "function ErzeugeBmpHeader: TBitmapInfoHeader" intern ein "procedure ErzeugeBmpHeader(var Result: TBitmapInfoHeader)".

Fazit: Bei elementaren Datentypen (Byte, Word, Integer usw.) sind Funktionen vorzuziehen, bei komplexen Datentypen gibt's sowieso keinen Unterschied.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 16:02
Also, nach den Hilfetexten zum ASM in der OH, kann man eigentlich sagen, daß beides entweder beides gleich schnell, die Funktion schneller, oder auch die Prozedur schneller ist.

Es kommt halt nur darauf an von welchem Typ das Result ist, da je nach Datentyp eine andere Methode verwendet wird.
Oder was direkt nach der Funktion/Prozedur mit dem Parameter/Result angestellt wird.


Eine pauschale Antwort was nun schneller ist kann zu 100% keiner geben.


Wenn allerdings eine bestimmte Funktionalität (Typ des Parameters und dessen Verwendungsweise außerhalb der Funktion/Prozedur) vorliegt, dann wäre eine Aussage über die vermutlich bessere (z.B. schneller) Variante möglich.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

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

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 16:17
Letztendliche Gewissheit bringt nur ein Durchsteppen durch das CPU-Fenster.

...was ich nun auch mal getan habe:
Code:
function y: Integer;
----------------------
  CALL y
  XOR  eax, eax  // Inhalt von eax 0 setzen
  RET             // Rücksprung

  MOV [esp],eax  // Zuweisung an lokale Variable erg (In Aufrufermethode)



procedure x(var Arg : integer);
----------------------
  MOV  eax, esp // In esp steht der Pointer auf die lokale Variable erg; diesen als Parameter laden (In Aufrufermethode)
  CALL x

  XOR  edx, edx // einfach in einem freien Register eine 0 erzeugen
  MOV [eax],edx // und an die Speicherstelle schreiben
  RET            // Rücksprung
Damit steht die Prozedur mit einer Anweisung mehr prinzipiell schlechter da. Jedoch bleibt die Frage wie stark die CPU selbst mit Caching usw. da noch mitspielt. Zudem ist der erzeugte Code sicherlich abhängig davon in welchem Kontext er sich befindet.

\\edit: Drüber hinaus müsste die erste Anweisung bei der Prozedur nur ein einziges Mal vor Ausführung einer Schleife (zumindest bei obiger) ausgeführt werden, solange zwischendrin EAX unangetastet bleibt. Somit wären sie in einer Messung in einer Schleife vermutlich (in diesem Fall!) gleich schnell. Das XOR ließe sich an dieser Stelle in diesem Fall auch bei mehrfachem Aufruf sparen, so edx nicht anderweitig verändert wird, aber da dies in einer ausgelagerten Prozedur geschieht die nichts darüber wissen kann, wird es auch in einer Schleife bestehen bleiben. Da kann der Optimierer nicht dran - mit Inlining hätte er hier also sogar einen doppelten Vorteil: Einmal spart man sich den CALL, und zum zweiten ließe sich eine ganze Anweisug wegoptimieren. Ferner würde sich dann sogar erkennen lassen, dass v immer der selbe Wert zugewiesen wird, und der ganze Kram incl. Schleife könnte rausgeschmissen werden, und v ein einziges Mal mit einer Konstanten belegt... jaja, ich war schon immer Fan von Inlining ^^
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#18

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 16:33
Warum wird bei deiner Prozedur ein Parameter übergeben und bei der Funktion nicht?
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

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

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 16:35
Zitat von Tubos:
Warum wird bei deiner Prozedur ein Parameter übergeben und bei der Funktion nicht?
Weil es den Prozeduren des Threaderstellers gleicht
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

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

Re: Was ist schneller, Funktion oder Prozedure?

  Alt 28. Okt 2005, 16:38
Zitat von himitsu:
@Dizzy:
Du mußt bei dieser Betrachtung auch mit einbeziehen, wie die Funktion/Prozedur aufgerufen wird.
Also, es ist nicht nur das wichtig was innerhalb der Funktion/Prozedur geschieht, sondern auch wie der Parameter an die Funktion/Prozedur übergeben und zurückgenommen wird.
Dessen bin ich mir bewusst. Daher schrieb ich ja auch, dass es hier doch sehr stark auf den Kontext ankommt. Allein schon wenn man nicht "lose" Funktionen, sondern Klassenmethoden aufruft ändert sich einiges. Auch was sonst drumherum passiert kann das ganze Bild verändern. Eine pauschale Antwort ist hier also kaum machbar.

\\edit:
Zitat:
hat sich erledigt -.-''
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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:34 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