Folgende Themen werden behandelt:
Die beste Leistung wird erreicht, wenn Sie die Datenformate gepackt numerisch (P) und ganzzahlig (I4) bei arithmetischen Operationen 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 höher 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 Benutzungen 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 Skalarvariable 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 Exponenten, 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 die Leistung noch weiter steigert. Hinsichtlich Leistung ist 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 Skalarfeld 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 Skalarfeld des Typs N (numerisch).
Am besten geeignet für die Variablenzwischenspeicherung (Variable Caching) sind Programme mit langen Sequenzen, die wiederholt auf dieselbe Variable zugreifen, insbesondere wenn die Variable ein Array ist. Durch die Variablenzwischenspeicherung 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
.