Zitat von
Luckie:
Speziell an Hagen noch mal:
Du hast auf Seite 1 oder 2 folgende Aussagen gemacht:
in den Thread hats du folgende Aussagen getroffen:
- 3 ordinale Paramter maximal für Proceduren
- 2 ordinale Paramter maximal für Methoden (Self ist der 3. unsichtbare Parameter)
- register Aufrufkonvention wenn möglich
- Result immer nur am Ende der Funktion belegen, oder vor einem Exit;
- möglichst wenige lokale unkomplizierte Variablen
- das Aufsplitten komplexer Funktionen auf mehrere weniger komplexe Funktion macht den Code meistens schneller, da der Optimierer besser arbeiten kann (gilt auch für nested Proceduren)
Könntest du die mir bitte noch mal erleätern / begründen? Die Hintergründe hierzu wären nicht schlecht zu erfahren. Danke.
*handheb* Wenn ich auch versuchen darf:
Zitat:
3 ordinale Paramter maximal für Proceduren
Es gibt 4 allgemeine CPU-Register: EAX, EBX, ECX und EDX. Eines davon, ich glaub EBX (oder ECX) wird vom Betriebssystem ständig verwendet, die anderen stehen dem Benutzer zur Verfügung. Wenn man nun die richtige Aufrufkonvention verwendet, nämlich
register, werden so viele Parameter wie möglich in die Register geschrieben und nicht in den
RAM (Stack). Bei max. 3 Parametern ist also alles im Register. Dazu ist noch zu sagen, dass es Ordinal-Typen sein sollen, oder, komplexen Dateitypen, Zeiger auf diese (deswegen auch const bzw. var). Denn in ein Register passen 4 Byte, aber kein 32-Byte-Record.
Registeraufrufe sind schneller, da Daten sowieso erst in Registern verarbeitet werden. Sind sie im Speicher, müssen sie erst in ein Register kopiert werden.
Beispiel:
(a sei Variable, also Speicheradresse)
ist eigentlich:
Code:
MOV EAX,a
ADD EAX,10
MOV a, EAX
Zitat:
2 ordinale Paramter maximal für Methoden (Self ist der 3. unsichtbare Parameter)
ergibt sich aus dem ersten, bei einer Methode wird immer ein dritter Parameter Self übergeben
Zitat:
Result immer nur am Ende der Funktion belegen, oder vor einem Exit;
Der Rückgabewert einer Funktion stehz am Ende in EAX. Wenn also nach dem Belegen des Rückgabewerts noch Aktionen ausgeführt werden, die das Regsiter EAX beanspruchen, wird das Result im Speicher abgelegt und muss am Ende in EAX kopiert werden.
Wird danach nix mehr gemacht, wird das Result sofort in EAX geschrieben und es muss nix mehr kopiert werden.
So, ich hoffe, das war soweit korrekt, aber den Rest sollte wirklich Hagen erklären