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
.
Um pouco de conhecimento pode ser uma coisa perigosa.
Pode ser mais rápido fazer uma comparação grande do que muitas pequenas comparações; O Enterprise COBOL da IBM (até a versão 4.2) pode ter um ARMAZENAMENTO DE TRABALHO máximo de 128 MB (a versão 5.0 pode ter 2 GB); O ARMAZENAMENTO LOCAL oferece mais 128 MB se você precisar de mais espaço.
A tarefa é confirmar que um pedaço de armazenamento de 11584 bytes tenha o valor "OLÁ! MUNDO!" em algum lugar, e o resto é espaço.
O programador, fictício, decide escrever um subprograma para isso (apenas no caso de ser necessário em outro lugar) e incluir sua técnica de alto desempenho (bônus).
O programador calcula que 11584 * 11584 tem 128 MB, portanto usa WORKING-STORAGE para uma tabela enorme e LOCAL-STORAGE para tudo o que for necessário.
O programador codifica e sorri conscientemente para si mesmo quando a compilação está limpa. Eles estavam certos quanto aos 128MB.
Testa o código. Funciona. Possivelmente um pouco lento, mas há uma carga pesada na máquina. Sorri novamente, pensando em quão lento seria se codificado sem o nível de conhecimento especializado deles.
O ARMAZENAMENTO DE TRABALHO chega a 134.189.056 bytes, e também existem alguns bytes de outras coisas. Deve ser grande o suficiente.
A realidade é que fazer uma comparação longa em vez de uma comparação curta, conforme implementado aqui, é uma maneira muito lenta de fazê-lo.
Ainda mais lento, o LOCAL-STORAGE, que é inicializado por rotinas de tempo de execução toda vez que um subprograma é chamado, faz com que todos os 128MB sejam configurados para cada CHAMADA.
O programador estava completamente errado sobre o tamanho da tabela, há espaço suficiente sem usar LOCAL-STORAGE. As comparações longas podem superar as comparações curtas, mas apenas quando o número real de comparações é reduzido.
Eu considerei trocar o LOCAL-STORAGE e o WORKING-STORAGE, é muito menos provável que alguém o codifique dessa maneira, então não o fiz. Colocar um VALUE SPACE na mesa (se estivesse em LOCAL-STORAGE) teria iniciado a tabela duas vezes em cada CHAMADA, de forma ainda mais lenta.
O Bloat não pode ser removido sem reescrever o programa. A maior parte do código é ruim, embora exista uma técnica útil.
Este não é um exemplo da vida real, mas posso imaginar alguém fazendo isso, se alguém for inteligente o suficiente :-)
Compilar não é problema. Executá-lo com todas as possibilidades rapidamente prova que não vale a pena tentar.
Obviamente, também existe um velho bug comum. Muito comum em tarefas de "pesquisa".