Performance-Überlegungen

Folgende Themen werden behandelt:


Formate

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.

Beispiel:

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.

Arrays

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.

Alphanumerische Felder

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 ...

DECIDE ON

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.

Numerische Werte

Versuchen Sie, wenn Sie numerische Konstanten in Zuweisungen oder arithmetischen Operationen verwenden, die Konstanten zu veranlassen, denselben Typ zu haben wie die Operation.

Daumenregeln

  • 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.

Variablen-Positionierung

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.

Variablen-Zwischenspeicherung (Caching)

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.

Beispiel für Variablen-Zwischenspeicherung (Caching)

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.

NODBG

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.