Codeoptimierung — Änderungen 7116 → 7118

Zeile 3: Zeile 3:
 
== Allgemeines ==
 
== Allgemeines ==
 
=== Datengrößen ===
 
=== Datengrößen ===
−
*Die Wortgröße des Prozessors zu verwenden ist meist die schnellste. (32 Bit bei i386, 64 Bit bei x86-64).
+
*Die Wortgröße des Prozessors zu verwenden ist meist vorteilhaft. (32 Bit bei i386, 64 Bit bei x86-64).
  
 
=== Alignment ===
 
=== Alignment ===
−
* Code und Daten sollten in getrennten [[Page]]s gehalten werden.
+
* Code und Daten sollten in getrennten [[Paging|Pages]] gehalten werden.
 
* Wenn man aber gezwungen ist, Code und Daten zu mischen, dann sollte man die Daten so legen, dass Sprünge nicht darüber hinweg springen müssen.
 
* Wenn man aber gezwungen ist, Code und Daten zu mischen, dann sollte man die Daten so legen, dass Sprünge nicht darüber hinweg springen müssen.
 
* Selbst modifizierender Code widerspricht diesem Prinzip.
 
* Selbst modifizierender Code widerspricht diesem Prinzip.
Zeile 25: Zeile 25:
 
* Wenn in einer Schleife dieselbe Berechnung immer wieder ausgeführt wird, dann kann diese auch einmalig vor der Schleife berechnet werden.
 
* Wenn in einer Schleife dieselbe Berechnung immer wieder ausgeführt wird, dann kann diese auch einmalig vor der Schleife berechnet werden.
 
Auch Funktionsaufrufe fallen unter Sprünge.
 
Auch Funktionsaufrufe fallen unter Sprünge.
−
* Funktionen, die nur wenig leisten, sollten vermieden und ihr Code direkt eingearbeitet werden (diesem Zweck dient das inline-Schlüsselwort in C)
+
* Funktionen, die nur wenig leisten, sollten vermieden und ihr Code direkt eingearbeitet werden (diesem Zweck dient das inline-Schlüsselwort in C, allerdings werden kurze Funktionen bei entsprechender Optimierung vom C-Compiler oft auch automatisch entsprechend behandelt)
  
 
=== Caching ===
 
=== Caching ===
Zeile 35: Zeile 35:
 
== Assembler ==
 
== Assembler ==
 
=== Reduzierung der Codegröße ===
 
=== Reduzierung der Codegröße ===
−
Die nachfolgenden Tricks eignen sich besonders zum Programmieren in [[Assembler]], wie es z.B. im [[Bootloader]] nötig ist.
+
Die nachfolgenden Tricks eignen sich besonders zum Programmieren in [[Assembler]], wie es z. B. im [[Bootloader]] nötig ist.
  
 
{| {{prettytable}}
 
{| {{prettytable}}
Zeile 45: Zeile 45:
 
|-
 
|-
 
|Prüfen, ob Register 0 ist
 
|Prüfen, ob Register 0 ist
−
|<asm>test eax, eax<br>jz ...</asm>
+
|<asm>test eax, eax
 +
jz ...</asm>
 
|-
 
|-
 
|Multiplikation mit einer Zweierpotenz
 
|Multiplikation mit einer Zweierpotenz
Zeile 70: Zeile 71:
 
|Addition, Subtraktion
 
|Addition, Subtraktion
 
|<asm>lea eax, [ebx + ecx + 4]</asm>
 
|<asm>lea eax, [ebx + ecx + 4]</asm>
 +
|-
 +
|Bestimmte Multiplikationen (z.&nbsp;B. mit 3 oder 5)
 +
|<asm>lea eax, [edx * 4 + edx]</asm>
 
|}
 
|}
  
 
=== Steigerung der Effektivität ===
 
=== Steigerung der Effektivität ===
−
* Registerzugriffe sind immer schneller als Arbeitsspeicher-Zugriffe.
+
* Registerzugriffe sind immer schneller als Arbeitsspeicherzugriffe.
 
* Daher sollten Parameter an Funktionen über Register, nicht über den Stack übergeben werden.
 
* Daher sollten Parameter an Funktionen über Register, nicht über den Stack übergeben werden.
  
 
==== PUSHA / POPA ====
 
==== PUSHA / POPA ====
−
* von der Verwendung von pusha/popa ist meist abzuraten, da man auch jedes einzelne Register direkt pushen/popen kann, und dabei selektiver vorgehen kann.
+
* Von der Verwendung von pusha/popa ist meist abzuraten, da man auch jedes einzelne Register direkt pushen/popen kann, und dabei selektiver vorgehen kann.
  
 
== Hochsprachen ==
 
== Hochsprachen ==