COBOL
ID DIVISION.
PROGRAM-ID. BLOAT.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 THE-TEST-STRINGS.
05 FILLER OCCURS 11584 TIMES.
10 TEST-STRING PIC X(11584).
LOCAL-STORAGE SECTION.
01 FIRST-TIME-FLAG PIC X VALUE "Y".
01 DISP-BEFORE-STRING COMP PIC 9(8).
01 LOOP-COUNTER COMP PIC 9(8).
01 START-STRING.
05 FILLER OCCURS 0 TO 11584 TIMES
DEPENDING ON DISP-BEFORE-STRING.
10 FILLER PIC X.
05 THE-SUBSTRING PIC X(12).
01 INITIAL-STRING PIC X(12)
VALUE "HELLO WORLD!".
LINKAGE SECTION.
01 STRING-PARAMETER PIC X(11584).
01 THE-RESULT PIC X.
PROCEDURE DIVISION USING
STRING-PARAMETER
THE-RESULT
.
IF FIRST-TIME-FLAG = "Y"
PERFORM SET-UP-STRINGS
END-IF
PERFORM
VARYING LOOP-COUNTER
FROM 1
BY 1
UNTIL LOOP-COUNTER
GREATER THAN 11584
OR STRING-PARAMETER
EQUAL TO TEST-STRING
( LOOP-COUNTER )
END-PERFORM
IF STRING-PARAMETER
EQUAL TO TEST-STRING ( LOOP-COUNTER )
MOVE "Y" TO THE-RESULT
ELSE
MOVE "N" TO THE-RESULT
END-IF
GOBACK
.
SET-UP-STRINGS.
PERFORM
VARYING LOOP-COUNTER
FROM 0
BY 1
UNTIL LOOP-COUNTER
EQUAL TO 11584
MOVE 11584 TO DISP-BEFORE-STRING
MOVE SPACE TO START-STRING
MOVE LOOP-COUNTER TO DISP-BEFORE-STRING
MOVE INITIAL-STRING TO THE-SUBSTRING
MOVE START-STRING TO TEST-STRING
( LOOP-COUNTER + 1 )
END-PERFORM
MOVE "N" TO FIRST-TIME-FLAG
.
Ein bisschen Wissen kann gefährlich sein.
Es kann schneller sein, einen großen Vergleich durchzuführen als viele kleine Vergleiche. IBMs Enterprise COBOL (bis Version 4.2) kann einen maximalen ARBEITS-STORAGE von 128 MB haben (Version 5.0 kann 2 GB haben); LOCAL-STORAGE bietet weitere 128 MB, wenn Sie mehr Speicherplatz benötigen.
Die Aufgabe besteht darin, zu bestätigen, dass ein 11584-Byte-Speicher den Wert "HELLO WORLD!" Irgendwo und der Rest ist Platz.
Der fiktive Programmierer beschließt, ein Unterprogramm dafür zu schreiben (nur für den Fall, dass es woanders benötigt wird) und seine Hochleistungstechnik einzubeziehen (Bonus).
Der Programmierer berechnet, dass 11584 * 11584 128 MB groß ist, verwendet also WORKING-STORAGE für eine große Tabelle und LOCAL-STORAGE für alles andere, was benötigt wird.
Der Programmierer verschlüsselt es und lächelt wissentlich, wenn die Kompilierung sauber ist. Sie hatten Recht mit den 128MB.
Testet den Code. Es klappt. Möglicherweise etwas langsam, aber die Maschine ist stark belastet. Lächelt wieder und denkt darüber nach, wie langsam es wäre, wenn sie ohne ihr Expertenwissen codiert würden.
Der WORKING-STORAGE kommt auf 134.189.056 Bytes und es gibt auch ein paar Bytes von anderen Sachen. Sollte groß genug sein.
Die Realität ist, dass ein langer Vergleich anstelle eines kurzen Vergleichs, wie hier implementiert, ein sehr langsamer Weg ist, dies zu tun.
Noch langsamer bewirkt der LOCAL-STORAGE, der bei jedem Aufruf eines Unterprogramms durch Laufzeitroutinen initialisiert wird, dass für jeden CALL die gesamten 128MB eingerichtet werden.
Der Programmierer hat sich in Bezug auf die Größe des Tisches einfach geirrt, es ist genügend Platz vorhanden, ohne LOCAL-STORAGE zu verwenden. Lange Vergleiche können kurze Vergleiche schlagen, aber nur, wenn die tatsächliche Anzahl der Vergleiche verringert wird.
Ich habe darüber nachgedacht, das LOKALE LAGER und das ARBEITSLAGER zu vertauschen. Es ist nur weitaus unwahrscheinlicher, dass jemand es so codiert, also habe ich es nicht getan. Wenn Sie einen VALUE-SPACE-Wert auf den Tisch legen (wenn er sich in LOCAL-STORAGE befunden hätte), würde der Tisch bei jedem CALL zweimal initialisiert , also noch langsamer.
Das Aufblähen kann nicht entfernt werden, ohne das Programm neu zu schreiben. Der meiste Code ist schlecht, obwohl es eine nützliche Technik gibt.
Dies ist kein reales Beispiel, aber ich kann mir vorstellen, dass jemand es tut, wenn dieser jemand klug genug ist :-)
Kompilieren ist überhaupt kein Problem. Es erweist sich schnell als nicht wert, es mit jeder Möglichkeit zu versuchen.
Natürlich gibt es auch einen einfachen alten Bug. Sehr häufig bei der Suche nach Aufgaben.