Performance-Überlegungen

#### Search Results

Search

# Performance-Überlegungen

Folgende Themen werden behandelt:

- Formate

- Arrays

- Alphanumerische Felder

- DECIDE ON

- Numerische Werte

- Variable Positionierung

- Variablenzwischenspeicherung (Caching)

- NODBG

## Formate

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.

#### 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 Benutzungen 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 Skalarvariable 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 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.

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

## Variablenzwischenspeicherung (Caching)

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.

### Beispiel für Variablenzwischenspeicherung (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`.

### On this page

- Formate
- Arrays
- Alphanumerische Felder
- DECIDE ON
- Numerische Werte
- Variable Positionierung
- Variablenzwischenspeicherung (Caching)
- NODBG