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
.
Una piccola conoscenza può essere pericolosa.
Può essere più veloce fare un grande confronto rispetto a molti piccoli confronti; Enterprise COBOL di IBM (fino alla versione 4.2) può avere un WORKING-STORAGE massimo di 128 MB (la versione 5.0 può avere 2GB); LOCAL-STORAGE offre ulteriori 128 MB se hai bisogno di più spazio.
Il compito è confermare che un archivio di 11584 byte ha il valore "HELLO WORLD!" da qualche parte, e il resto è spazio.
Il programmatore fittizio decide di scrivere un sottoprogramma per questo (nel caso fosse necessario altrove) e di includere la loro tecnica ad alte prestazioni (bonus).
Il programmatore calcola che 11584 * 11584 è 128 MB, quindi utilizza WORKING-STORAGE per una tabella enorme e LOCAL-STORAGE per tutto il necessario.
Il programmatore lo codifica e sorride consapevolmente a se stesso quando la compilazione è pulita. Avevano ragione circa i 128 MB.
Verifica il codice. Funziona. Forse un po 'lento, ma c'è un carico pesante sulla macchina. Sorride di nuovo, pensando a quanto sarebbe lento se codificato senza il loro livello di conoscenza degli esperti.
Il WORKING-STORAGE arriva a 134.189.056 byte e ci sono anche alcuni byte di altre cose. Dovrebbe essere abbastanza grande.
La realtà è che fare un confronto lungo invece di un confronto breve, come implementato qui, è un modo molto lento per farlo.
Ancora più lento, il LOCAL-STORAGE, che viene inizializzato dalle routine di runtime ogni volta che viene chiamato un sottoprogramma, causa la configurazione dell'intero 128 MB per ogni CHIAMATA.
Il programmatore aveva semplicemente torto sulla dimensione del tavolo, c'è abbastanza spazio senza usare LOCAL-STORAGE. I confronti lunghi possono battere i confronti brevi, ma solo quando viene ridotto il numero effettivo di confronti.
Ho pensato di scambiare LOCAL-STORAGE e WORKING-STORAGE, è molto meno probabile che qualcuno lo codifichi in questo modo, quindi non l'ho fatto. Mettere uno SPAZIO VALORE sulla tabella (se fosse stato in LOCAL-STORAGE) avrebbe inizializzato la tabella due volte su ogni CHIAMATA, quindi anche più lentamente.
Il bloat non può essere rimosso, senza riscrivere il programma. Gran parte del codice è errato, anche se esiste una tecnica utile.
Questo non è un esempio di vita reale, ma posso immaginare qualcuno che lo faccia, se qualcuno è abbastanza intelligente :-)
La compilazione non è affatto un problema. Eseguirlo con ogni possibilità si rivela rapidamente non vale la pena tentare.
Certo, c'è anche un semplice vecchio bug. Molto comune nelle attività di "ricerca".