Reihenvergrößerung

In der Computerwissenschaft ist Reihenvergrößerung oder inlining, ein Handbuch oder Bearbeiter-Optimierung, die eine Funktionsanruf-Seite durch den Körper des callee ersetzt. Diese Optimierung kann Gebrauch der Zeit und Raums an der Durchlaufzeit an den möglichen Kosten verbessern, die Endgröße des Programms (d. h. die binäre Dateigröße) zu vergrößern.

Normalerweise, wenn eine Funktion angerufen wird, wird Kontrolle seiner Definition durch einen Zweig oder Anruf-Instruktion übertragen. Mit inlining fällt Kontrolle durch direkt zum Code für die Funktion, ohne einen Zweig oder Anruf-Instruktion. Inlining verbessert Leistung auf mehrere Weisen:

  • Es entfernt die Kosten des Funktionsanrufs und der Rückkehrbefehle, sowie jedes anderen Prologs und des Schlusswort-Codes, der in jede Funktion durch den Bearbeiter eingespritzt ist.
  • Das Beseitigen von Zweigen und das Halten des Codes, der eng miteinander im Gedächtnis durchgeführt wird, verbessern Instruktionsleistung des geheimen Lagers durch die Besserung der Gegend der Verweisung.
  • Sobald inlining durchgeführt worden ist, werden zusätzliche Intraverfahrensoptimierungen möglich auf dem Inlined-Funktionskörper. Zum Beispiel kann eine als ein Argument passierte Konstante, häufig zu allen Beispielen des zusammenpassenden Parameters fortgepflanzt werden, oder ein Teil der Funktion kann" einer Schleife "hochgezogen werden.

Die primären Kosten von inlining sind, dass er dazu neigt, Codegröße zu vergrößern, obwohl er so nicht immer tut. Inlining kann auch Leistung in einigen Fällen - zum Beispiel vermindern, vielfache Kopien einer Funktion können Codegröße genug vergrößern, dass der Code nicht mehr das geheime Lager einfügt, auf mehr geheimes Lager Fräulein hinauslaufend.

Einige Sprachen (zum Beispiel, C und C ++) unterstützen das Schlüsselwort in Funktionsdefinitionen. Dieses Schlüsselwort dient als ein "Hinweis" dem Bearbeiter, dass es zum Reihen-die Funktion versuchen sollte. Bearbeiter verwenden eine Vielfalt von Mechanismen einschließlich Hinweise von Programmierern, zu entscheiden, welche Funktionsanrufe inlined sein sollten.

Bearbeiter führen gewöhnlich Behauptungen mit inlining durch. Schleife-Bedingungen und Schleife-Körper brauchen faule Einschätzung. Dieses Eigentum wird erfüllt, wenn der Code, um Schleife-Bedingungen und Schleife-Körper zu schätzen, inlined ist. Leistungsrücksichten sind ein anderer Grund zu Reihenbehauptungen.

Im Zusammenhang von funktionellen Programmiersprachen wird Reihenvergrößerung gewöhnlich von der Transformation der Beta-Verminderung gefolgt.

Ein Programmierer könnte Reihen-eine Funktion manuell durch die Kopie und Teig-Programmierung als eine ehemalige Operation auf dem Quellcode. Jedoch sind andere Methoden, inlining zu kontrollieren, (sieh unten) vorzuziehend, weil sie das Programmfehler-Entstehen nicht hinabstürzen, wenn der Programmierer (vielleicht modifiziert) kopierte Version des ursprünglichen Funktionskörpers überblickt, während er einen Programmfehler in der Inlined-Funktion besticht.

Durchführung

Sobald der Bearbeiter zum Reihen-entschieden hat, ist eine besondere Funktion, die inlining Operation durchführend, selbst gewöhnlich einfach. Je nachdem, ob der Bearbeiter inlines Funktionen über den Code auf verschiedenen Sprachen, der Bearbeiter inlining auf irgendeinem eine Zwischendarstellung auf höchster Ebene (wie abstrakte Syntax-Bäume) oder eine auf niedriger Stufe Zwischendarstellung tun kann. In jedem Fall schätzt der Bearbeiter einfach die Argumente, versorgt sie in Variablen entsprechend den Argumenten der Funktion, und fügt dann den Körper der Funktion an der Anruf-Seite ein.

Linkers, sowie Bearbeiter, kann auch Funktion inlining tun. Wenn ein linker inlines Funktionen, es Reihenfunktionen kann, deren Quelle wie Bibliotheksfunktionen nicht verfügbar ist (sieh Bindezeit-Optimierung). Ein Laufzeitsystem kann Reihenfunktion ebenso. Durchlaufzeit inlining kann dynamische Kopierfräsinformation verwenden, um bessere Entscheidungen über der Funktionen zum Reihen-, als im javanischen Krisenherd-Bearbeiter zu treffen.

Hier ist ein einfaches Beispiel der Reihenvergrößerung durchgeführt "mit der Hand" am Quellniveau auf der C Programmiersprache:

interne Nummer pred (interne Nummer x) {\

wenn (x == 0)

kehren Sie 0 zurück;

sonst

geben Sie x - 1 zurück;

}\

</Quelle>

Vorher inlining:

interne Nummer f (interne Nummer y) {\

geben Sie pred (y) + pred (0) + pred (y+1) zurück;

}\

</Quelle>

Danach inlining:

interne Nummer f (interne Nummer y) {\

int Zeitsekretärin = 0;

wenn (y == 0) Zeitsekretärin + = 0; sonst Zeitsekretärin + = y - 1;/* (1) * /

wenn (0 == 0) Zeitsekretärin + = 0; sonst Zeitsekretärin + = 0 - 1;/* (2) * /

wenn (y+1 == 0) Zeitsekretärin + = 0; sonst Zeitsekretärin + = (y + 1) - 1;/* (3) * /

geben Sie Zeitsekretärin zurück;

}\</Quelle>

Bemerken Sie, dass das nur ein Beispiel ist. In einer wirklichen C Anwendung würde es vorzuziehend sein, eine inlining Spracheigenschaft wie parametrisierte Makros oder Reihenfunktionen zu verwenden, dem Bearbeiter zu sagen, den Code auf diese Weise umzugestalten. Die folgende Abteilung verzeichnet Weisen, diesen Code zu optimieren.

Inlining durch den Zusammenbau Makrovergrößerung

Assemblermakros stellen eine alternative Annäherung an inlining zur Verfügung, wodurch eine Folge von Instruktionen normalerweise Reihen-durch die Makrovergrößerung von einer einzelnen Makroquellbehauptung (mit der Null oder mehr Rahmen) erzeugt werden kann. Einer der Rahmen könnte eine Auswahl sein, ein ehemaliges getrenntes Unterprogramm wechselweise zu erzeugen, das die Folge enthält, und bearbeitet stattdessen durch einen inlined rufen der Funktion zu.

Beispiel:

BEWEGEN SIE FROM=array1, TO=array2, INLINE=NO

Vorteile

Reihenvergrößerung selbst ist eine Optimierung, da sie oben von Anrufen beseitigt, aber es ist als eine Ermöglichen-Transformation viel wichtiger. D. h. sobald der Bearbeiter einen Funktionskörper im Zusammenhang seiner Anruf-Seite — häufig mit Argumenten ausbreitet, die feste Konstanten sein können - es kann im Stande sein, eine Vielfalt von Transformationen zu tun, die vorher nicht möglich waren. Zum Beispiel kann sich ein bedingter Zweig erweisen, immer wahr oder immer an dieser besonderen Anruf-Seite falsch zu sein. Das kann der Reihe nach tote Codebeseitigung, Codebewegung der Schleife-invariant oder Induktionsvariable-Beseitigung ermöglichen.

Im C Beispiel in der vorherigen Abteilung sind Optimierungsgelegenheiten im Überfluss. Der Bearbeiter kann dieser Folge von Schritten folgen:

  • Die Behauptungen in den Linien haben (1) gekennzeichnet, (2) und (3) tun nichts. Der Bearbeiter kann sie entfernen.
  • Die Bedingung ist immer wahr, so kann der Bearbeiter die Linie gekennzeichnet (2) mit der Folgerung, ersetzen (der nichts tut).
  • Der Bearbeiter kann die Bedingung dazu umschreiben.
  • Der Bearbeiter kann den Ausdruck auf (das Annehmen der Bildumlauf-Überschwemmungssemantik) reduzieren
  • Die Ausdrücke und können Null nicht beide gleichkommen. Das lässt den Bearbeiter einen Test beseitigen.

Die neue Funktion ist ähnlich:

interne Nummer f (interne Nummer y) {\

wenn (y == 0)

geben Sie y zurück;/* oder Rückkehr 0 * /

sonst, wenn (y ==-1)

geben Sie y - 1 zurück;/* oder Rückkehr-2 * /

sonst

geben Sie y + y - 1 zurück;

}\</Quelle>

Probleme

Das Ersetzen einer Anruf-Seite mit einem ausgebreiteten Funktionskörper kann Leistung auf mehrere Weisen schlechter machen:

  • In Anwendungen, wo Codegröße wichtiger ist als Geschwindigkeit wie so viele eingebettete Systeme, ist inlining gewöhnlich abgesehen von sehr kleinen Funktionen nachteilig triviale mutator Methoden.
  • Die Zunahme in der Codegröße kann eine kleine, kritische Abteilung des Codes veranlassen, das geheime Lager nicht mehr einzufügen, geheimes Lager Fräulein und Verlangsamung verursachend.
  • Die zusätzlichen Variablen aus dem inlined Verfahren können zusätzliche Register, und in einem Gebiet verbrauchen, wo Register-Druck bereits hoch ist, kann das das Überlaufen zwingen, das zusätzliche RAM-Zugänge verursacht.
  • Eine Sprachspezifizierung kann einem Programm erlauben, zusätzliche Annahmen über Argumente für Verfahren zu machen, dass sie nicht mehr machen kann, nachdem das Verfahren inlined ist.
  • Wenn Codegröße zu viel vergrößert wird, können Quelleneinschränkungen wie RAM-Größe überschritten werden, zu Programmen führend, die entweder nicht geführt werden können oder diese Ursache-Dresche. Heute wird das kaum ein Problem mit der Arbeitsfläche oder den Server-Computern außer mit sehr aggressivem inlining sein, aber es kann noch ein Problem für eingebettete Systeme sein.

Gewöhnlich denken Bearbeiter-Entwickler an diese Probleme und amtlich eingetragene Heuristik in ihre Bearbeiter, die wählen, welche Funktionen zum Reihen-, um Leistung zu verbessern, anstatt sie in den meisten Fällen schlechter zu machen.

Beschränkungen

Es ist zum Reihen-ein Unterprogramm nicht immer möglich. Ziehen Sie den Fall eines Unterprogramms in Betracht, das sich rekursiv nennt, bis er ein besonderes Stück von Eingangsdaten von einem peripherischen erhält. Der Bearbeiter kann nicht allgemein bestimmen, wenn dieser Prozess enden wird, so würde es inlining nie beenden, wenn es zum Reihen-jede einzelne Unterprogramm-Beschwörung entworfen würde. So müssen Bearbeiter für Sprachen, die recursion unterstützen, Beschränkungen anhaben, was sie zum Reihen-automatisch wählen werden.

Auswahl-Methoden und Sprachunterstützung

Viele Bearbeiter aggressiv Reihenfunktionen, wo auch immer es vorteilhaft ist, um so zu tun. Obwohl es zu größerem executables führen kann, ist aggressiver inlining dennoch immer wünschenswerter geworden, weil Speicherkapazität schneller zugenommen hat als Zentraleinheitsgeschwindigkeit. Inlining ist eine kritische Optimierung auf funktionellen Sprachen und objektorientierten Programmiersprachen, die sich darauf verlassen, um genug Zusammenhang für ihre normalerweise kleinen Funktionen zur Verfügung zu stellen, klassische Optimierungen wirksam zu machen.

Siehe auch

Links

sind

Elektronische Designautomation / Luleå Universität der Technologie
Impressum & Datenschutz