Alias-Name:
SET-OPTIMIZATION-PROPERTIES
Mit dieser Anweisung lässt sich die Optimierung des Compilers ganz oder teilweise ein- und ausschalten.
Einzelheiten zur Wirkung der Optimierung finden Sie ab "Verlauf der Optimierung".
MODIFY-OPTIMIZATION-PROPERTIES | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
LEVEL = *UNCHANGED
Es gilt die Angabe der letzten MODIFY-OPTIMIZATION-PROPERTIES-Anweisung.
LEVEL = *LOW
Es werden keine Standardoptimierungen durchgeführt. In dieser Optimierungsstufe ist Testen mit AID möglich.
LEVEL=*LOW wird automatisch an Stelle der Angabe *HIGH bzw. *VERY-HIGH gesetzt, wenn gleichzeitig die Option TEST-SUPPORT=*YES gesetzt ist.
LEVEL = *HIGH(...) / *VERY-HIGH(...)
Bei Angabe von *HIGH oder *VERY-HIGH werden alle Standardoptimierungen durchgeführt (siehe „Standardoptimierungen" (Verlauf der Optimierung)“). Der Unterschied zwischen diesen beiden Stufen besteht darin, dass bei *HIGH intern jede Optimierungsstrategie nur einmal durchgeführt wird, bei *VERY-HIGH mehrmals. Entsprechend wird in der Optimierungsstufe *HIGH deutlich weniger Übersetzungszeit benötigt als in der „hochoptimierenden“ Stufe *VERY-HIGH.
Mit den Parametern der *HIGH- bzw. *VERY-HIGH-Struktur lässt sich die Expansion von Schleifen einzeln beeinflussen. In diesen Optimierungsstufen ist Testen mit AID nicht möglich.
LOOP-UNROLLING = *UNCHANGED / *NO / *YES(FACTOR = 4 / <integer 1..100>...)
Diese Option steuert die Expansion von Schleifen. Durch eine mehrmalige Expansion des Schleifenrumpfes wird eine geringere Ausführungszeit für die Schleifendurchläufe erzielt. Zusätzlich entsteht mit dem expandierten Schleifenrumpf neues Optimierungspotential. Diese Optimierungsmaßnahme ist wegen der Code-Wiederholungen mit einer Vergrößerung des erzeugten Objekts verbunden.
Standardmäßig versucht der Optimierer, Schleifenrümpfe viermal zu expandieren:
Mit <integer> kann ein eigener Expansionsfaktor ausgewählt werden. Die Angabe eines Faktors garantiert aber nicht in jedem Fall die Durchführung einer Schleifenexpansion. Vielmehr entscheidet der Optimierer anhand von Schleifenstruktur und angegebenem Expandierungsfaktor, ob die Expansion durchgeführt wird.
Mit *NO wird die Schleifenexpansion unterdrückt.
Weitere Einzelheiten siehe auch unter „Expansion von Schleifen“ (Verlauf der Optimierung).
INLINING =
Diese Option steuert die Inline-Generierung von benutzereigenen Funktionen. Wie auch bei der Inline-Generierung von einigen C-Bibliotheksfunktionen aus der Standardbibliothek (siehe BUILTIN-FUNCTIONS), wird jeder Aufruf einer Inline-Funktion durch den entsprechenden Funktionscode ersetzt und durch die Einsparung der Aufruf- und Rücksprung-Codefolge eine bessere Ablaufzeit erzielt.
Diese Optimierungsmaßnahme ist wegen der Code-Wiederholungen mit einer Vergrößerung des erzeugten Objekts verbunden.
Weitere Einzelheiten siehe auch unter „Inline-Generierung von benutzereigenen Funktionen“ (Verlauf der Optimierung).
Standardeinstellungen des Compilers
Wenn die INLINING-Option nicht angegeben wird, gelten abhängig vom C- oder C++-Sprachmodus folgende Standardeinstellungen:
C-Sprachmodi (MODIFY-SOURCE-PROPERTIES LANGUAGE=*C):
INLINING=*NO
Es wird keine Inline-Generierung durchgeführt.C++-Sprachmodi (MODIFY-SOURCE-PROPERTIES LANGUAGE=*CPLUSPLUS):
INLINING=*YES(USER-FUNCTIONS=*BY-SOURCE)
Es wird die Inline-Generierung der C++-sprachspezifischen Inline-Funktionen durchgeführt (mit dem Attributinline
versehene Funktionen und innerhalb von Klassen definierte Elementfunktionen).
INLINING = *UNCHANGED
Es gilt die Angabe der letzten MODIFY-OPTIMIZATION-PROPERTIES-Anweisung.
INLINING = *NO
Vom Optimierer werden keine benutzereigenen Funktionen inline generiert. *NO ist in den C-Sprachmodi voreingestellt, wenn keine INLINING-Option angegeben wird. Außerdem wird *NO vom Compiler an Stelle der Angaben *YES(...) automatisch angenommen, wenn gleichzeitig die Option TEST-SUPPORT=*YES gesetzt ist.
INLINING = *YES(USER-FUNCTIONS = *UNCHANGED / list-poss: *STD / *BY-SOURCE / <c-string 1..255 with-low>)
*UNCHANGED:
Es gilt die Angabe der letzten MODIFY-OPTIMIZATION-PROPERTIES-Anweisung.
*STD:
Wenn nur *STD angegeben wird, wählt der Optimierer Funktionen für die Inline-Generierung nach eigenen Kriterien aus. *STD impliziert die Angabe *BY-SOURCE. Das heißt, dass bei der Suche nach geeigneten Kandidaten auch inline-Pragmas und C++-sprachspezifische Inline-Funktionen vom Optimierer mitberücksichtigt werden (vgl. *BY-SOURCE). *STD ist voreingestellt, wenn INLINING=*YES angegeben wird.
*BY-SOURCE:
Wenn nur *BY-SOURCE angegeben wird, werden ausschließlich folgende benutzereigene Funktionen inline generiert:
In den C-Sprachmodi C-Funktionen, die mit folgender
#pragma
-Anweisung angegeben werden:#pragma inline
funktionsname
Das inline-Pragma wird in den C++-Sprachmodi nicht unterstützt.
Siehe auch Abschnitt „inline-Pragma“.In den C++-Sprachmodi C++-Funktionen mit dem Attribut
inline
sowie die innerhalb von Klassen definierten C++-Funktionen.
In den C++-Sprachmodi ist *BY-SOURCE voreingestellt, wenn keine INLINING-Option angegeben wird.
<c-string>:
Mit <c-string> kann der Name einer benutzereigenen C-Funktion angegeben werden, die der Optimierer inline generieren soll. Die Angabe von selbst ausgewählten Funktionen mit <c-string> wird nur in den C-Sprachmodi unterstützt, da es in C++ eigene Sprachmittel für die Inline-Generierung von Funktionen gibt. <c-string> impliziert die Angabe *BY-SOURCE. Das heißt, dass auch inline-Pragmas vom Optimierer mitberücksichtigt werden (vgl. *BY-SOURCE in den C-Sprachmodi).
list-poss:
Die Angaben *STD, <c-string> und aus Kompatibilitätsgründen auch *BY-SOURCE können miteinander kombiniert werden. In diesem Fall versucht der Optimierer zunächst die mit *BY-SOURCE und/oder <c-string> angegebenen Funktionen inline zu generieren. Anschließend wählt er - sofern *STD angegeben wird - nach eigenen Kriterien Funktionen für die Inline-Generierung aus. Die Angabe von *BY-SOURCE ist nicht notwendig, da sie bei gleichzeitiger Angabe von *STD oder <c-string> implizit angenommen wird.
Sinnvolle Kombinationen:
*STD, <c-string>
<-c-string>, <c-string>, ...
Beispiel zur INLINING-Option
//MODIFY-OPTIMIZATION-PROP - //LEVEL=*HIGH,INLINING=*YES(USER-FUNCT=(*STD,’funct1’,’funct2’))
Weitere Einzelheiten siehe auch unter „Inline-Generierung von benutzereigenen Funktionen“ (Verlauf der Optimierung).
BUILTIN-FUNCTIONS = *UNCHANGED / *NONE / *ALL /list-poss: <c-string 1..125 with-low>
Mit dieser Option kann angegeben werden, für welche C-Bibliotheksfunktionen die Implementierung im CRTE angenommen werden kann. Dies erlaubt eine bessere Optimierung des Programms.
*UNCHANGED:
Es gilt die Angabe der letzten MODIFY-OPTIMIZATION-PROPERTIES-Anweisung.
*NONE:
Es wird kein Aufruf von Bibliotheksfunktionen besonders optimiert.
*ALL
Alle Aufrufe von bekannten Bibliotheksfunktionen werden gesondert behandelt.
<c-string>:
Aufrufe auf diese Funktion werden gesondert behandelt.
Den größten Effekt erreicht der Compiler durch Inline-Generierung einer Funktion. Dabei wird der Funktionscode direkt in die Aufrufstelle eingesetzt. Zeitaufwendige Verwaltungsaktivitäten des Laufzeitsystems (z.B. Register retten und restaurieren, Rücksprung aus der Funktion) fallen weg. Die Progamm-Ablaufzeit wird damit verkürzt.
Folgende C-Bibliotheksfunktionen können inline generiert werden:
strcpy | memcmp |
Hinweise
Inline generierte Funktionen können weder zum Bindezeitpunkt durch andere Funktionen ersetzt noch beim Testen mit AID als Testpunkte benutzt werden.
Nicht inline generierte Funktionen bleiben als Aufruf erhalten. Es sind jedoch Optimierungen möglich, die bei Benutzer-Funktionen nicht machbar sind. Zum Beispiel kann der Compiler die Information nutzen, dass die Funktion
isdigit()
keine Seiteneffekte hat.Wird eine Funktion mit einem dem Compiler bekannten Namen selbst definiert, so kann es Konflikte mit dieser Option geben. Im Allgemeinen hat die vom Benutzer geschriebene Funktion eine andere Implementierung als die Funktion im CRTE. An der Stelle der Definition wird die Warnung CFE2067 ausgegeben, um auf einen Konflikt hinzuweisen.
Beachten Sie, dass die Eigenschaften der CRTE-Implementierung in jeder Übersetzungseinheit benutzt werden. Die Warnung wird jedoch nur in der Übersetzungseinheit ausgegeben, die die private Definition enthält.
Die folgende Tabelle fasst die Standardeinstellungen der MODIFY-OPTIMIZATION-PROPERTIES-Anweisung und möglichen Modifikationen noch einmal zusammen.
*HIGH(...) / *VERY-HIGH(...) | *LOW | |
Standardoptimierungen | *YES | *NO |
LOOP-UNROLLING | *YES | *NO |
BUILTIN-FUNCTIONS | *NONE | |
INLINING ( in C ) | *NO | |
INLINING ( in C++ ) | *YES(USER-FUNCTIONS=*BY-SOURCE) |