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
.
Sedikit pengetahuan bisa menjadi hal yang berbahaya.
Bisa lebih cepat untuk melakukan satu perbandingan besar daripada banyak perbandingan kecil; Enterprise COBOL IBM (hingga Versi 4.2) dapat memiliki PENYIMPANAN KERJA maksimum 128 MB (Versi 5.0 dapat memiliki 2GB); LOCAL-STORAGE menawarkan 128MB lebih lanjut jika Anda membutuhkan lebih banyak ruang.
Tugasnya adalah untuk mengkonfirmasi bahwa sepotong penyimpanan 11584 byte memiliki nilai "HELLO WORLD!" suatu tempat, dan sisanya adalah ruang.
Programmer, fiktif, memutuskan untuk menulis sub-program untuk ini (kalau-kalau diperlukan di tempat lain), dan untuk memasukkan teknik kinerja tinggi (bonus).
Programmer menghitung bahwa 11584 * 11584 adalah 128MB, jadi gunakan WORKING-STORAGE untuk tabel besar, dan LOCAL-STORAGE untuk semua hal lain yang diperlukan.
Programmer mengkodekannya, dan tersenyum dengan sadar ketika kompilasi bersih. Mereka benar tentang 128MB.
Menguji kodenya. Berhasil. Mungkin agak lambat, tetapi ada beban berat pada mesin. Tersenyum lagi, berpikir betapa lambatnya jika dikodekan tanpa tingkat pengetahuan ahli mereka.
STORAGE KERJA hadir di 134.189.056 byte, dan ada beberapa byte yang baik dari hal-hal lain juga. Harus cukup besar.
Kenyataannya adalah melakukan perbandingan panjang dan bukan perbandingan singkat, seperti yang diterapkan di sini, adalah cara yang sangat lambat untuk melakukannya.
Bahkan lebih lambat, LOCAL-STORAGE, yang diinisialisasi dengan run-time rutin setiap kali sebuah sub-program dipanggil, menyebabkan 128MB seluruh diatur untuk setiap PANGGILAN.
Programmer hanya salah tentang ukuran tabel, ada cukup ruang tanpa menggunakan PENYIMPANAN LOKAL. Perbandingan panjang dapat mengalahkan perbandingan pendek, tetapi hanya ketika jumlah aktual perbandingan dikurangi.
Saya mempertimbangkan untuk menukar sekitar PENYIMPANAN LOKAL dan PENYIMPANAN KERJA di sekitar, itu jauh lebih kecil kemungkinan seseorang akan mengkodekannya seperti itu, jadi saya tidak melakukannya. Menempatkan VALUE SPACE di atas meja (jika sudah di LOCAL-STORAGE) akan menginisialisasi tabel dua kali pada setiap CALL, jadi lebih lambat.
The Bloat tidak dapat dihapus, tanpa menulis ulang program. Sebagian besar kode itu buruk, meskipun ada satu teknik yang berguna.
Ini bukan contoh kehidupan nyata, tapi saya bisa membayangkan seseorang melakukannya, jika seseorang itu cukup pintar :-)
Kompilasi sama sekali bukan masalah. Menjalankannya dengan setiap kemungkinan dengan cepat terbukti tidak layak dicoba.
Tentu saja, ada Bug tua biasa juga. Yang sangat umum dalam tugas "pencarian".