Folgende Themen werden behandelt:
Die beste Leistung wird erreicht, wenn Sie bei arithmetischen Operationen die Datenformate gepackt numerisch (P) und ganzzahlig (I4) verwenden.
Vermeiden Sie die Konvertierung von Daten zwischen den Formaten gepackt numerisch (P), ungepackt numerisch (N), Ganzzahl (I) und Fließkomma (F), da dies selbst bei optimiertem Code Verarbeitungsaufwand verursacht.
Da es bei optimiertem Code keinen Interpretationsaufwand gibt, werden die Unterschiede zwischen den verschiedenen Datenformaten viel deutlicher: Bei optimiertem Code ist die Leistungsverbesserung, die durch die Verwendung des Formats P anstelle von zum Beispiel N erzielt wird, noch größer als bei normalem Code.
A = A + 1
In der obigen numerischen Berechnung
mit nicht-optimiertem Code wird das Format P um ca. 13 % schneller als Format N ausgeführt,
mit optimiertem Code wird das Format P jedoch um ca. 56 % schneller als Format N ausgeführt.
Die Leistungssteigerung, die durch Benutzung des Natural Optimizer Compiler bei diesem einzelnen Statement erzielt wird, ist:
mit nicht gepackten Operanden (N): 8 mal schneller,
mit gepackten Operanden (P): 15 mal schneller.
Array-Bereichsoperationen, wie zum Beispiel
MOVE A(*) TO B(*)
werden effizienter ausgeführt, als wenn die gleiche Funktion unter
Verwendung einer FOR
-Statement-Verarbeitungsschleife programmiert
worden wäre. Dies ist auch für optimierten Code gültig.
Bei Benutzung von Indizes sollte das Ganzzahlformat I4 verwendet werden, um eine optimale Leistung zu erzielen.
Wenn Sie eine alphanumerische Konstante in eine alphanumerische Variable (Format A) verschieben oder eine alphanumerische Variable mit einer alphanumerischen Konstanten vergleichen, empfehlen wir Ihnen, die Länge der alphanumerischen Konstante an die Länge der Variablen anzupassen. Dadurch wird die Operation erheblich beschleunigt, zum Beispiel:
A(A5):='XYZAB' ... IF A = 'ABC ' THEN ...
ist schneller als
IF A = 'ABC' THEN ...
Wenn Sie das DECIDE ON
-Statement mit einer
Systemvariablen, einem Array oder einem
operand1
-Parameter benutzen, ist es
effizienter, den Wert in eine im LOCAL
-Speicherabschnitt
definierte Skalar-Variable mit gleichem Typ und gleicher Länge zu
verschieben.
Versuchen Sie, wenn Sie numerische Konstanten in Zuweisungen oder arithmetischen Operationen verwenden, die Konstanten zu veranlassen, denselben Typ zu haben wie die Operation.
Jede numerische Konstante mit oder ohne Dezimalstelle, aber ohne Exponent, wird zu einer gepackten Zahl mit der minimalen Länge und Genauigkeit zur Darstellung des Wertes kompiliert, es sei denn, die Konstante ist ein Array-Index oder eine Teilstring-Startposition oder -Länge, in diesem Fall wird sie zu einer 4-Byte-Ganzzahl (I4). Diese Regel gilt unabhängig von den an der Operation beteiligten Variablentypen.
Operationen, die Fließkomma enthalten, werden in Fließkomma
ausgeführt. Fügen Sie bei numerischen Werten E00
hinzu, um zu
erzwingen, dass sie Fließkomma sind, zum Beispiel:
ADD 1E00 to F(F8)
Operationen, die kein Fließkomma sondern gepackt numerische,
ungepackt numerische, Datums- oder Zeit-Variablen enthalten, werden in
gepackten Dezimalzahlen ausgeführt. Für ADD
, SUBTRACT
und IF
erzwingen Sie, dass numerische Konstanten die gleiche
Anzahl an Dezimalstellen wie die Variable mit der höchsten Genauigkeit haben,
indem Sie eine Dezimalstelle und nachgestellte Nullen hinzufügen, zum Beispiel:
ADD 1.00 TO P(P7.2)
Bei MULTIPLY
und DIVIDE
ist diese
Technik nicht nötig.
Um den Optimierungsprozess zu erleichtern, sollten Sie versuchen, alle skalaren Referenzen am Anfang des Datenbereichs und alle Array-Referenzen am Ende des Datenbereichs zu halten.
Der Natural Optimizer Compiler enthält einen Algorithmus, der die Leistung noch weiter steigert. Hinsichtlich Leistung verhält sich das Statement in Abhängigkeit von den Typen der Operanden unterschiedlich. Das Statement wird langsamer ausgeführt, wenn es sich bei einem oder mehreren der Operanden um einen Parameter, ein Array oder ein Skalar-Feld des Typs N (numerisch) oder Kombinationen aus diesen handelt. Der Natural Optimizer Compiler analysiert den Programmfluss und bestimmt, welche Variablen mit einer oder mehreren dieser Kennzeichen zweimal oder mehrmals gelesen werden, ohne das in sie geschrieben wird. Der Natural Optimizer Compiler verschiebt dann den Wert jeder einzelnen Variablen in einen temporären Zwischenspeicherbereich, wo auf ihn unter folgenden Bedingungen schnell zugegriffen werden kann:
Auf die Variable wird oft zugegriffen, sie wird aber selten geändert und
die Variable ist ein Array eines beliebigen Typs oder ein Skalar-Feld des Typs N (numerisch).
Am besten geeignet für die Variablen-Zwischenspeicherung (Variable Caching) sind Programme mit langen Sequenzen, die wiederholt auf dieselbe Variable zugreifen, insbesondere wenn die Variable ein Array ist. Durch die Variablen-Zwischenspeicherung wird dann eine komplexe und wiederkehrende Adressenberechnung vermieden.
Das folgende Beispiel demonstriert den Vorteil der
Variablenzwischenspeicherung. Die Ausführung dieses Programms, das mit
NODBG
(siehe unten) und
CACHE=ON
katalogisiert wurde, beanspruchte in einem Test 47 % der
Zeit, die bei NODBG
and CACHE=OFF
benötigt wird. Wird
das Programm mit CACHE=ON
katalogisiert, verringert sich der
NOC-generierte Code von 856 Bytes auf 376 Bytes.
DEFINE DATA LOCAL 1 ARR(N2/10,10,10) 1 I(I4) INIT <5> 1 J(I4) INIT <6> 1 K(I4) INIT <7> END-DEFINE DECIDE ON EVERY ARR(I,J,K) VALUE 10 IGNORE VALUE 20 IGNORE VALUE 30 IGNORE VALUE 40 IGNORE VALUE 50 IGNORE VALUE 60 IGNORE VALUE 70 IGNORE VALUE 80 IGNORE VALUE 90 IGNORE NONE IGNORE END-DECIDE
Warnung: Wenn der Inhalt einer im Cache zwischengespeicherten Variablen mit dem Kommando MODIFY VARIABLE des
Natural Debugger
geändert wird, wird nur der Inhalt der ursprünglichen Variablen geändert. Der
zwischengespeicherte Wert (der möglicherweise noch in nachfolgenden Statements
benutzt wird) bleibt unverändert. Daher sollte Variablen-Caching mit großer
Sorgfalt eingesetzt werden, wenn der Natural Debugger verwendet wird. Siehe
auch die Natural-Debugger-Dokumentation. |
Wenn ein Programm gründlich getestet und in Produktion genommen
wurde, sollten Sie das Programm mit der Option
NODBG
, wie im
Abschnitt Optimizer-Optionen
beschrieben, katalogisieren. Ohne Debug-Code werden die optimierten Statements
um 10% bis 30% schneller ausgeführt.
Bei Angabe der Option NODBG
wird der zum Erleichtern
des Debug-Vorgangs vorhandene Code entfernt, und zwar auch bei eingeschalteten
Optionen INDX
und OVFLW
.