Кобол
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
.
Немного знаний может быть опасной вещью.
Это может быть быстрее сделать одно большое сравнение, чем много маленьких сравнений; Максимальный объем рабочего хранилища IBM Enterprise COBOL (до версии 4.2) составляет 128 МБ (в версии 5.0 может быть 2 ГБ); LOCAL-STORAGE предлагает дополнительные 128 МБ, если вам нужно больше места.
Задача состоит в том, чтобы подтвердить, что 11584-байтовый фрагмент памяти имеет значение "HELLO WORLD!" где-то, а остальное пространство.
Вымышленный программист решает написать подпрограмму для этого (на случай, если она понадобится где-то еще) и включить свою высокопроизводительную технику (бонус).
Программист рассчитывает, что 11584 * 11584 - это 128 МБ, поэтому он использует WORKING-STORAGE для огромной таблицы и LOCAL-STORAGE для всего остального, что необходимо.
Программист кодирует это и сознательно улыбается себе, когда компиляция чиста. Они были правы насчет 128МБ.
Проверяет код. Оно работает. Возможно, немного медленно, но на машине есть большая нагрузка. Снова улыбается, думая, как медленно это будет, если кодируется без их уровня экспертных знаний.
РАБОЧЕЕ ХРАНЕНИЕ имеет размер 134 189 056 байт, и есть еще несколько байтов других вещей. Должно быть достаточно большим.
Реальность такова, что выполнять длинное сравнение вместо короткого, как это реализовано здесь, - очень медленный способ сделать это.
Еще медленнее, LOCAL-STORAGE, который инициализируется подпрограммами времени выполнения каждый раз, когда вызывается подпрограмма, заставляет все 128 МБ быть настроенными для каждого CALL.
Программист был просто не прав насчет размера таблицы, там достаточно места без использования LOCAL-STORAGE. Длинные сравнения могут превзойти короткие, но только когда фактическое количество сравнений уменьшается.
Я подумал об обмене МЕСТНЫМ ХРАНИЛИЩОМ и РАБОЧИМ ХРАНИЛИЩОМ, гораздо менее вероятно, что кто-то закодирует его таким образом, поэтому я этого не сделал. Помещение VALUE SPACE на стол (если бы оно было в LOCAL-STORAGE) дважды инициализировало бы стол при каждом ВЫЗОВЕ, поэтому даже медленнее.
Раздувать нельзя, без переписывания программы. Большая часть кода плохая, хотя есть одна полезная техника.
Это не реальный пример, но я могу представить, что кто-то делает это, если этот человек достаточно умен :-)
Компиляция не проблема вообще. Запускать его при любой возможности быстро не стоит.
Конечно, есть и старая ошибка. Очень часто встречается в «поисковых» заданиях.