![]() |
Was ist schneller, Funktion oder Prozedure?
Also ich hab einmal
Delphi-Quellcode:
und
Procedure x(var Arg : integer);
begin Arg:=0; end;
Delphi-Quellcode:
die ja beide glaube ich das selbe machen
function y:integer;
begin Result:=0; end; einziger Unterschiede ist der AUfruf :
Delphi-Quellcode:
x(erg);
Delphi-Quellcode:
Aber Sind Beide genau gleichschnell in der Ausführung oder ist eins schneller?
erg:=y;
Edit: :hello: ich hab die no bashing signatur JUHU :party: |
Re: Was ist schneller, Funktion oder Prozedure?
Teste es doch mal :)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var lol,lol2: Int64; v: Integer; begin QueryPerformanceCounter(lol); x(v); QueryPerformanceCounter(lol2); Label1.Caption := IntToStr(lol2-lol); QueryPerformanceCounter(lol); v := y; QueryPerformanceCounter(lol2); Label2.Caption := IntToStr(lol2-lol); end; |
Re: Was ist schneller, Funktion oder Prozedure?
Ich denke, wenn es Performence-Unterschiede gibt, dann ist die function langsamer, weil dort noch ein Rückgabewert gespeichert wird. Aber das ist so minimal, dass der Unterschied nicht spürbar ist. Es wird halt höchstens noch eine Variable mehr gespeichert, mehr passiert nicht ;)
Edit: Schmarn, es ging ja darum, dass bei der Procedure eine Variable per Parameter zurückgegeben wird. :oops: |
Re: Was ist schneller, Funktion oder Prozedure?
Hmm.. Funktion ist schneller, Prozedur schwankt zwischen 4 und 5, Funktion konstant bei 3
(bedeutet doch das funtion schneller ist oder?) |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
...:cat:... |
Re: Was ist schneller, Funktion oder Prozedure?
Dann halt
Delphi-Quellcode:
Funktion is bei mir schneller :)
procedure TForm1.Button1Click(Sender: TObject);
var lol,lol2: Int64; v: Integer; i: Integer; begin QueryPerformanceCounter(lol); For i := 1 To 100000 Do begin x(v); end; QueryPerformanceCounter(lol2); Label1.Caption := IntToStr(lol2-lol); QueryPerformanceCounter(lol); For i := 1 To 100000 Do begin v := y; end; QueryPerformanceCounter(lol2); Label2.Caption := IntToStr(lol2-lol); end; |
Re: Was ist schneller, Funktion oder Prozedure?
WOW, das ändert das ganze schon beträchtlich : Prozedur liegt bei 3,107773 Funktion bei 3,087948
Edit :
Delphi-Quellcode:
bei anz = 10000000 wird plötzlich die Prozedur schneller (3,14 für prozedure und 3,26 für Funktion)
var
lol,lol2: Int64; v,w,i: Integer; const anz = 1000000 ; begin w:=0; for i:= 1 to anz do begin QueryPerformanceCounter(lol); xx(v); QueryPerformanceCounter(lol2); w:=w+ lol2-lol; end; Label1.Caption := FloatToStr(w/anz ); w:=0; for i:= 1 to anz do begin QueryPerformanceCounter(lol); v:=y; QueryPerformanceCounter(lol2); w:=w+ lol2-lol; end; Label2.Caption := FloatToStr(w/anz ); end; |
Re: Was ist schneller, Funktion oder Prozedure?
Damit kannst Du sagen: nutze das, was Dir an der Stelle beim Schreiben mehr nutzen bringt (wahrscheinlich die Funktion), da der Geschwindigkeitsunterschied vernachlässigbar gering ausfällt ;)
...:cat:... |
Re: Was ist schneller, Funktion oder Prozedure?
Du solltest allerdings die Aufrufe von QueryPerformanceCounter aus der Schleife herausnehmen und jeweils nur zwei Mal aufrufen - das verfälscht doch beträchtlich.
|
Re: Was ist schneller, Funktion oder Prozedure?
:wiejetzt: :gruebel:
nach 100.000.000 ist wieder die Funktion vorne... naja ich muss dann bald mal .. schönes WE euch allen |
Re: Was ist schneller, Funktion oder Prozedure?
Ist eine Prozedur nicht eine Funktion,
bei der der Rückgabewert immer #0 ist? |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Du kannst ja danach den ermittelten Wert nochma teilen. |
Re: Was ist schneller, Funktion oder Prozedure?
@Angel4585: Besser so, sonst misst du ja fast nur die Laufzeit von QueryPerformanceCounter und nicht von deiner Funktion/Prozedur :wink:
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; |
Re: Was ist schneller, Funktion oder Prozedure?
ach die misst sich selber auch mit?? ist ja besch...
schönes WE zusammen |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
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. |
Re: Was ist schneller, Funktion oder Prozedure?
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. |
Re: Was ist schneller, Funktion oder Prozedure?
Letztendliche Gewissheit bringt nur ein Durchsteppen durch das CPU-Fenster.
...was ich nun auch mal getan habe:
Code:
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.
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 \\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 ^^ |
Re: Was ist schneller, Funktion oder Prozedure?
Warum wird bei deiner Prozedur ein Parameter übergeben und bei der Funktion nicht?
|
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
|
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
\\edit: Zitat:
|
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Code:
Das wäre nochmal ein Stückchen schneller, da man hier keinen Speicherzugriff hat. Unter Umständen kann der letzte Befehl "MOV esi,eax" sogar entfallen, nämlich dann wenn "erg" im Folgenden auf das Register eax abgebildet wird.
function y: Integer;
---------------------- CALL y XOR eax, eax // Inhalt von eax 0 setzen RET // Rücksprung MOV esi,eax // Zuweisung an lokale Variable erg, die sich nun im Register esi befindet Wie ich oben bereits schrieb, Aufrufe mit var Parameter erzwingen immer eine Speichervariable. Deshalb kann man schon eine pauschale Aussage machen, nämlich: bei primitiven Datentypen Funktionen benutzen, kann der Optimierung dienlich sein. |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
denn auch in einer procedure kann mal etwas schiefgehen und das bekommt der aufrufer dann nicht mit. |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Wobei bei einer Exception sogar ein Var-Parameter seine Vorteile haben kann, da man diesen ja am Anfang der Prozedur (vor einer eventuellen Exception) auf einen bestimmten Wert setzen kann, wärend bei der Funktion im Exceptionfall der Rückgabewert verloren geht. Und wiso soll der Benutzer ausgerechnet nur bei Prozedur nichts mitbekommen, wenn was schiefgeht? |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
|
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Rückgabe per parameter... hab ich komplett vergessen. War wohl ein Blackout ;) |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Delphi-Quellcode:
procedure x(var AValue: Integer); inline;
begin AValue := 0; end; function y: Integer; inline; begin Result := 0; end; var i: Integer; begin x(i); i := y; end. ![]() Mein Wissen über Assembler tendiert zwar gegen null, aber das sieht für mich ziemlich ähnlich aus :stupid: . Die Geschwindigkeiten sollten wohl auch nah beieinander liegen :stupid:² . Von anderen Optimierungen sehe ich aber nichts. |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
\\edit: Jedoch hast du insofern Recht, als dass das xor für die 2. Codezeile über ist, ja. Da scheint mir der Optimizer kaum optimal zu sein. Mit ein Grund weswegen ich scharf darauf bin manche Dinge in asm selbst von Hand machen zu können - ich kann dem Automatismus also nicht voll vertrauen :D |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
|
Re: Was ist schneller, Funktion oder Prozedure?
Mh, find ich nun fast enttäuschend. Dann heisst Inlining dort tatsächlich nur Ersparnis des Calls, bzw. der Vorbereitung der Parameter, und den Optimizer kümmerts nicht? In meinen Augen inkonsequent. In einem komplexeren Zusammenhang könnte ich ja verstehen dass da sicher nicht alles super-tip-top optimiert werden kann, da die Zusammenhänge sehr komplex werden können. Aber in so einem einfachen Fall dürfte das sehr wohl per Software erkennbar sein.
Aber nun back to Topic :stupid: |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
|
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Ein "var" Parameter erzwingt eine Speichervariable. Da ist dann nichts mehr drin mit Registeroptimierung und so. Wenn man also solche Tests macht, dann bitte den einzelnen Testfällen (hier der Prozedur und der Funktion) jeweils ihre eigenen lokalen Variablen geben.
Delphi-Quellcode:
So kann es ja nichts mit der Optimierung werden. Denn erstens ist i hier keine lokale Variable (wird also so oder so auf eine Speicherzelle abgebildet) und zweitens wird i für x und y benutzt, wobei x verhindert, das i auf ein Register statt Speicherzelle abgebildet wird.
var
i: Integer; begin x(i); i := y; end. So ist es besser:
Delphi-Quellcode:
Mit inlining wird "ergy := y" hier total wegoptimiert. ;)
procedure Test;
var ergx, ergy: Integer; begin x(ergx); ergy := y; end; |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Zitat:
Zitat:
Zitat:
Und ich meine es wäre auch (MS)C# gewesen der eine Schleife in der immer nur ein konstanter Wert auf eine Variable addiert wird, im Vorhinein komplett ausrechnet und nur mit einer Konstanten ohne Schleife implementiert. Ein "Optimizer" der nur greift wenn ich eh schon recht optimal gecoded habe, ist imho ebenfalls inkonsequent :). Zumal die Beispiele hier für den Coder offensichtliche Optimierungsmöglichkeiten zeigen. In dem obigen Beispiel geht es eher um die Ebene die der Programmierer erst im asm-code sehen könnte, und somit nichtmal direkten Einfluss darauf hat. Sicher sind die Methoden da oben sehr panne, da sie nur eine 0 schreiben. Aber es geht doch um das Konzept! Wenn so etwas einfaches nicht erkannt/verbessert wird, wie kann ich mich da noch darauf verlassen dass es in komplexeren Zusammenhängen besser läuft? |
Re: Was ist schneller, Funktion oder Prozedure?
![]() |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Zitat:
Delphi 2005 war die erste Version mit inlining, da kann man noch keine Perfektion erwarten. Ich habe gehört, dass es in Delphi 2006 schon ein bisschen verbessert worden ist. |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Nichtsdestotrotz - Delphi optimiert nicht so, wie es z.B. ein optimierender C- oder C++-Compiler tut. Dieser ist normalerweise auch dafür ausgelegt, total stupiden Code (wie in unserem Beispiel) zu optimieren - wenn sein Input nämlich von anderen Programmen wie lex oder yacc generiert wird, dann kann es sein, dass wirklich 10 mal "x = 10;" untereinander steht. |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
|
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Zitat:
Zitat:
Edit: Total verquottelt. |
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Danke Flocke - ich hätts heut irgendwie nicht besser/direkter schreiben können :D Zitat:
Zitat:
Zitat:
|
Re: Was ist schneller, Funktion oder Prozedure?
Zitat:
Zitat:
Zitat:
Zitat:
Edit: Irnkwie krieg' ich das mit dem Quoten nicht auf die Reihe... Edit2: :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:03 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