Na Vyvolanie Funkcie Inlining

Link: http://www.modularcircuits.com/blog/2013/05/01/on-function-call-inlining/

Počula som, takže mnohí tvrdia, že hlavným prínosom inlining je, že kompilátor môže uložiť hovoru a návrat pokyny. Niektoré príklady:

http://stackoverflow.com/questions/145838/benefits-of-inline-functions-in-c
http://www.exforsys.com/tutorials/c-plus-plus/inline-functions.html

To je všetko dobré a pekné, ale to nie je aj v poškriabanie povrchu prospech inlining.

Hlavným dôvodom inlining je výkonný nástroj na optimalizáciu je, že, keď je funkcia inlined, kompilátor môže optimalizovať s call-stránky. Konštanty sa môže šíriť do funkcie orgánu. Slučky môže byť efektívnejšie re-taxi, kód môže byť hoisted, registre môžu byť (viac) optimálne pridelené, v podstate všetky ťažké delostrelectvo, že kompilátor optimalizácia má byť nasadené na zlúčené funkcie. Okrem toho, pretože kompilátor má úplné informácie o tom, čo sa deje vo vnútri funkcie, ktorá sa nazývala, to nemá, aby konzervatívne predpoklady o vedľajšie účinky, ďalšie funkcie volania, atď.

Účinky všetky vyššie uvedené sú tak viac pôsobivých ako uložené hovor a vrátiť sa – dokonca aj vtedy, ak budete mať potenciál pobočka-misprediction trest a parameter ukladanie operácií do úvahy.

Niektoré to právo. Niektoré poznamenať si na to a ísť ďalej.

Na spodnej strane je samozrejme, že by to mohlo zvýšiť kód veľkosti. Nadmerné používanie inlining môže generovať viac (inštrukcie) cache-minie, ktoré môžu ublížiť svoj výkon celkom dosť. Môj osobný pokyny:

  • Malé funkcie by mali byť inlined
  • Veľké funkcie len pár hovor-stránky by mohol byť inlined
  • Veľké funkcie, volali z čísla miest, ktoré by nemali byť inlined – hoci niekoľko špecifických hovor-stránky by mohol byť inlined

Samozrejme, väčšina z nich sa rozhodnutia prijímajú svoj kompilátor už, ale kontrola výsledkov, a na príležitosti núti kompilátor ohýbať spôsob, ako môže byť prospešný: ak používate profil-riadený optimalizácia, kompilátor má robiť, inlining rozhodnutia na základe statického pohľadu kód, tak to nemôže vziať napríklad vykonanie frekvencie do úvahy.

Napokon, najväčším nepriateľom inlining (v C++) sú virtuálne funkcie: je to veľmi ťažké pre kompilátor vidieť cez virtuálne funkcie hovoru a uvedomiť si, že ste vždy (alebo väčšinu času) hovor rovnaké virtuálne funkcie. Poskytuje non-virtuálne varianty a manuálne volanie ich v prípadoch, keď sa inlining sa očakáva, že je pravdepodobne najlepší spôsob, ako odstrániť tento problém.

<päta class=”entry-meta”>Tento záznam bol vyslaný v Náhodné Ramblings Ondrej Tantos. Záložku permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *