Frage

In Anbetracht, dass Sie nur auf Geschwindigkeit optimieren sind versuchen, was ist gute Heuristik für die Entscheidung, ob eine Funktion Inline oder nicht? Offensichtlich sollte die Codegröße wichtig sein, aber gibt es andere Faktoren, normalerweise verwendet, wenn (beispielsweise) gcc oder icc ist die Bestimmung, ob ein Funktionsaufruf Inline? Hat es eine erhebliche wissenschaftliche Arbeiten in der Umgebung?

War es hilfreich?

Lösung

Wikipedia hat eine paar Absätze darüber, mit einigen Links unten:

  • Zusätzlich zu Speichergröße und Cache-Probleme, eine andere Überlegung ist Druck registrieren. Vom Standpunkt des Compilers der Ansicht „die hinzugefügten Variablen aus dem inlined Verfahren zusätzliche Register verbrauchen kann, und in einem Bereich, in den Registerdruck bereits hoch ist dieses verschütten zwingen kann, was zusätzlichen RAM Zugriffe verursacht.“

Sprachen mit JIT-Compiler und Runtime-Klasse Laden haben andere Nachteile, da die virtuellen Methoden nicht statisch bekannt sind, noch die JIT können collect Laufzeitprofilinformationen, wie zum Beispiel Methodenaufruf Frequenz:

  • Design, Implementierung und Evaluierung von Optimierungen in einem Just-in -Time Compiler (für Java) spricht über Verfahren inlining von statischen Methoden und dynamisch geladene Klassen und ihre Verbesserungen in der Leistung.

  • Üben JUDO: Java unter dynamischen Optimierungen Ansprüche, dass ihre „inlining Politik auf die Codegröße basiert und Profilinformationen. Wenn die Ausführungsfrequenz eines Methodeneintrag unter einem bestimmten Schwellenwert liegt, wird das Verfahren dann nicht inlined, weil sie als kalt Methode angesehen wird. zum vermeiden Code Explosion, wissen wir nicht inline ein Verfahren mit einer Bytecode-Größe von mehr als 25 Byte.... entlang einer tiefen Verbindungskette zu vermeiden inlining, stoppt inlining, wenn die akkumulierte inlined Bytecode Größe entlang der Verbindungskette 40 Bytes überschreitet.“ Obwohl sie Laufzeit haben Informationen (Methodenaufruf Frequenz) Profilierungs sind sie noch vorsichtig inlining große Funktionen oder Ketten von Funktionen zu vermeiden aufblasen zu verhindern.

A in Google Scholar suchen eine Reihe von Papieren zeigt, wie

Andere Tipps

Ein Funktionsaufruf beinhaltet einige zusätzliche Code (die Funktion Prolog, in dem die neue Stapelrahmen eingerichtet ist, und die Funktion Epilog, wo es gereinigt wird). Wenn Ihr Compiler sieht, dass der Funktionscode im Vergleich zum Prolog und Epilog klein ist, kann es sich entscheiden, es lohnt sich nicht einen tatsächlichen Anruf zu tätigen, und wird die Funktion inline.

Der einzige Vorteil sehe ich eine Funktion aufrufen, anstatt inlining es sind größenbezogene. Ich denke inlining eine Funktion dann in eine Schleife Abrollen in einer signifikanten Größenzunahme führen kann.

soweit ich sehe, Funktionsgröße ist der einzige Faktor Compiler verwendet inline zu bestimmen. Allerdings, wenn Sie Profil geführt Optimierung (PGO) tun, ich glaube Compiler in der Lage ist, andere Variablen zu verwenden, wie zum Beispiel Anzahl der Anrufe / Call-Setup-Zeit.

In .NET ist vor allem auf Größe basiert. Messen Sie die Größe der übergeordneten Funktion und Kind-Funktion in kompilierten Bytes. Dann messen Sie die Größe der kombinierten Funktion. Wenn die kombinierte Funktion kleiner ist, dann inlining ist eine gute Idee.

Der Grund dafür ist es möglich zu machen, wie viel Code in den Cache der CPU wie möglich zu schieben. Cache-Misses sind weitaus teurer als Funktionsaufrufe in modernen CPUs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top