Schnelleren Code schreiben: Übergeben Sie auf AMD64 keine Strukturen, die größer als 16 Byte sind
- Zur Verbesserung der Performance der Sprache Neat wurde die Übergabe eines Arrays als einzelner Strukturparameter auf die Übergabe von drei Zeigerparametern umgestellt.
- Der Grund, warum Neat-Arrays langsamer waren als Arrays in der Sprache D, war, dass das 24 Byte große Array die Grenze von 16 Byte überschritt und Parameter deshalb auf andere Weise übergeben wurden.
- Laut der SystemV-AMD64-ABI-Spezifikation werden alle Strukturen, die größer als 16 Byte sind, über Zeiger übergeben.
Bestätigung des Problems durch Benchmarks
- Durch Benchmarks wurde der Performance-Unterschied zwischen der Übergabe einer Struktur und der Übergabe einzelner Felder bestätigt.
- Bei der Übergabe einer Struktur sind Zuweisung auf dem Stack und ein Kopiervorgang erforderlich, während einzelne Felder direkt über SSE-Register übergeben werden.
- Die Übergabe einzelner Felder ist etwa doppelt so schnell wie die Übergabe einer Struktur.
Die Entscheidung von Sprachdesignern
- Beim Aufruf einer C-API muss das C-ABI eingehalten werden, intern verwendete High-Level-Typen müssen jedoch nicht als Strukturen dargestellt werden.
- Sprachdesigner können festlegen, wie Arrays, Tupel und Summentypen übergeben werden.
- Die Übergabe von Typen, die größer als 16 Byte sind, als einzelne Felder kann zur Performance-Steigerung beitragen.
Meinung von GN⁺
- Dieser Artikel ist für Entwickler, die sich für Software-Optimierung interessieren, sehr aufschlussreich.
- Insbesondere zeigt er, dass bei der Entwicklung performancekritischer Anwendungen die Größe von Strukturen und ihre Übergabeform einen wichtigen Einfluss haben können.
- Sprachdesigner oder API-Entwickler können diese Informationen nutzen, um Möglichkeiten zur Performance-Verbesserung zu finden.
1 Kommentare
Hacker-News-Kommentare
struct Vectorso angepasst wird, dass stattdessen per Referenz alsconst struct Vector &übergeben wird. Viel C++-Code mit Pointer-Bugs hat Pointer unnötig verwendet, obwohl eine Übergabe per Referenz einfacher und sicherer gewesen wäre.