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
.
Un poco de conocimiento puede ser algo peligroso.
Puede ser más rápido hacer una comparación grande que muchas comparaciones pequeñas; Enterprise COBOL de IBM (hasta la Versión 4.2) puede tener un ALMACENAMIENTO DE TRABAJO máximo de 128 MB (la Versión 5.0 puede tener 2 GB); ALMACENAMIENTO LOCAL ofrece otros 128 MB si necesita más espacio.
La tarea es confirmar que una pieza de almacenamiento de 11584 bytes tenga el valor "¡HOLA MUNDO!" en algún lugar, y el resto es espacio.
El programador ficticio decide escribir un subprograma para esto (en caso de que sea necesario en otro lugar) e incluir su técnica de alto rendimiento (bonificación).
El programador calcula que 11584 * 11584 es 128 MB, por lo que utiliza WORKING-STORAGE para una tabla enorme y LOCAL-STORAGE para todo lo demás que se necesita.
El programador lo codifica y sonríe conscientemente cuando la compilación está limpia. Tenían razón sobre los 128 MB.
Prueba el código. Funciona. Posiblemente un poco lento, pero hay una gran carga en la máquina. Sonríe de nuevo, pensando lo lento que sería si se codificara sin su nivel de conocimiento experto.
El ALMACENAMIENTO DE TRABAJO viene en 134,189,056 bytes, y también hay unos pocos bytes de otras cosas. Debería ser lo suficientemente grande.
La realidad es que hacer una comparación larga en lugar de una comparación corta, como se implementa aquí, es una forma muy lenta de hacerlo.
Aún más lento, el ALMACENAMIENTO LOCAL, que se inicializa mediante rutinas de tiempo de ejecución cada vez que se llama a un subprograma, hace que se configuren los 128 MB completos para cada LLAMADA.
El programador simplemente estaba equivocado sobre el tamaño de la tabla, hay suficiente espacio sin usar ALMACENAMIENTO LOCAL. Las comparaciones largas pueden superar las comparaciones cortas, pero solo cuando se reduce el número real de comparaciones.
Pensé en cambiar el ALMACENAMIENTO LOCAL y el ALMACENAMIENTO DE TRABAJO, es mucho menos probable que alguien lo codifique de esa manera, así que no lo hice. Poner un ESPACIO DE VALOR en la mesa (si hubiera estado en ALMACENAMIENTO LOCAL) habría inicializado la mesa dos veces en cada LLAMADA, por lo que aún más lento.
La hinchazón no se puede eliminar sin reescribir el programa. La mayor parte del código es malo, aunque hay una técnica útil.
Este no es un ejemplo de la vida real, pero puedo imaginar a alguien haciéndolo, si ese alguien es lo suficientemente inteligente :-)
Compilar no es un problema en absoluto. Ejecutarlo con todas las posibilidades rápidamente demuestra que no vale la pena intentarlo.
Por supuesto, también hay un viejo error simple. Una muy común en tareas de "búsqueda".