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.