Einzelnen Beitrag anzeigen

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