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