inline - wann, wie und warum?
Verfasst: 10.04.2017, 12:31
Hallo.
Wann sollte man inline nutzen? Wann sollte man __forceinline (MVSC) nutzen?
Zu meinem Verständnis:
Eine inline-Funktion wird direkt dort, wo sie aufgerufen wird, hinkopiert/hincompiliert, als hätte man die dort geschrieben/programmiert. Das spart dann mindestens einen Funktionsaufruf/Instruktion und meistens müssen dadurch weniger Variablen auf den Stack gepackt und am Ende wieder runter genommen werden. Vermutlich können Compiler durch inline-Funktionen auch noch andere Optimierungen vornehmen.
Ich habe zum Testen einige wichtige und oft aufgerufene Funktionen mit __forceinline versehen. Das Ergebnis war eine leicht größere Datei, aber die Performance war quasi identisch (z.B. gleiche FPS).
Ich habe bereits einige Änderungen bei dem Projekten bezüglich der Optimierung vorgenommen (siehe Dateianhang), was das manuelle/extra deklarieren einer Funktion als inline/__forceinline anscheinend komplett überflüssig macht.
Gibt es überhaupt noch Situationen, wo man inline/__forceinline nutzen sollte, wenn man bereits die entsprechenden Optimierungs-Einstellungen vorgenommen hat?
Und wenn ich gerade eh zur Optimierung etwas frage, wozu benötigt man Framezeiger? Ich habe diese, wie man sehen kann, deaktiviert, was ca. 1% mehr Performance rausgeholt hat. Bei der Release-Version mit den deaktivierten Framezeigern kann ich aber weiterhin StackWalk64 korrekt einsetzen und z.B. in Kombination mit der Symboldatei (.pdb) den aktuellen Stack in einer Fehlermeldung anzeigen.
Wann sollte man inline nutzen? Wann sollte man __forceinline (MVSC) nutzen?
Zu meinem Verständnis:
Eine inline-Funktion wird direkt dort, wo sie aufgerufen wird, hinkopiert/hincompiliert, als hätte man die dort geschrieben/programmiert. Das spart dann mindestens einen Funktionsaufruf/Instruktion und meistens müssen dadurch weniger Variablen auf den Stack gepackt und am Ende wieder runter genommen werden. Vermutlich können Compiler durch inline-Funktionen auch noch andere Optimierungen vornehmen.
Ich habe zum Testen einige wichtige und oft aufgerufene Funktionen mit __forceinline versehen. Das Ergebnis war eine leicht größere Datei, aber die Performance war quasi identisch (z.B. gleiche FPS).
Ich habe bereits einige Änderungen bei dem Projekten bezüglich der Optimierung vorgenommen (siehe Dateianhang), was das manuelle/extra deklarieren einer Funktion als inline/__forceinline anscheinend komplett überflüssig macht.
Gibt es überhaupt noch Situationen, wo man inline/__forceinline nutzen sollte, wenn man bereits die entsprechenden Optimierungs-Einstellungen vorgenommen hat?
Und wenn ich gerade eh zur Optimierung etwas frage, wozu benötigt man Framezeiger? Ich habe diese, wie man sehen kann, deaktiviert, was ca. 1% mehr Performance rausgeholt hat. Bei der Release-Version mit den deaktivierten Framezeigern kann ich aber weiterhin StackWalk64 korrekt einsetzen und z.B. in Kombination mit der Symboldatei (.pdb) den aktuellen Stack in einer Fehlermeldung anzeigen.