ภาษาโคบอล
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
.
ความรู้เล็กน้อยอาจเป็นสิ่งที่อันตราย
มันเร็วกว่าที่จะทำการเปรียบเทียบขนาดใหญ่กว่าการเปรียบเทียบขนาดเล็กจำนวนมาก Enterprise COBOL ของ IBM (สูงถึงเวอร์ชัน 4.2) สามารถมี WORKING-STORAGE สูงสุด 128MB (เวอร์ชัน 5.0 สามารถมี 2GB); LOCAL-STORAGE เสนออีก 128MB ถ้าคุณต้องการพื้นที่เพิ่ม
ภารกิจคือเพื่อยืนยันว่าหน่วยเก็บข้อมูล 11584- ไบต์มีค่า "HELLO WORLD!" ที่อื่นและที่เหลือก็คือที่ว่าง
โปรแกรมเมอร์สมมติว่าจะเขียนโปรแกรมย่อยสำหรับสิ่งนี้ (ในกรณีที่จำเป็นต้องใช้ที่อื่น) และรวมเทคนิคที่มีประสิทธิภาพสูง (โบนัส)
โปรแกรมเมอร์คำนวณว่า 11584 * 11584 เป็น 128MB ดังนั้นใช้ WORKING-STORAGE สำหรับตารางขนาดใหญ่และ LOCAL-STORAGE สำหรับทุกอย่างที่จำเป็น
โปรแกรมเมอร์เขียนโค้ดขึ้นมาและยิ้มอย่างรู้เท่าทันเมื่อคอมไพล์นั้นสะอาด พวกเขาถูกต้องเกี่ยวกับ 128MB
ทดสอบรหัส มันได้ผล. อาจจะช้าไปหน่อย แต่ก็มีภาระงานหนักบนเครื่อง ยิ้มอีกครั้งคิดว่าช้าแค่ไหนถ้าเขียนโดยไม่มีระดับความรู้จากผู้เชี่ยวชาญ
WORKING-STORAGE มีขนาด 134,189,056 bytes และมีอีกสองสามไบต์ในสิ่งอื่น ๆ เช่นกัน ควรมีขนาดใหญ่พอสมควร
ความจริงก็คือการทำการเปรียบเทียบแบบยาวแทนที่จะเป็นการเปรียบเทียบแบบสั้น ๆ ตามที่นำมาใช้ที่นี่เป็นวิธีที่ช้ามากในการทำ
แม้ช้ากว่า LOCAL-STORAGE ซึ่งเริ่มต้นด้วยรูทีนรันไทม์ทุกครั้งที่มีการเรียกโปรแกรมย่อยทำให้ 128MB ทั้งหมดถูกตั้งค่าสำหรับแต่ละ CALL
โปรแกรมเมอร์ผิดธรรมดาเกี่ยวกับขนาดของตารางมีห้องเพียงพอโดยไม่ต้องใช้ LOCAL-STORAGE การเปรียบเทียบแบบยาวสามารถเอาชนะการเปรียบเทียบแบบสั้น ๆ ได้ แต่เมื่อจำนวนการเปรียบเทียบจริงลดลง
ฉันคิดว่าการแลกเปลี่ยน LOCAL-STORAGE และ WORKING-STORAGE รอบ ๆ มันเป็นไปได้ยากที่จะมีคนใช้รหัสในลักษณะนั้นในรอบนั้นดังนั้นฉันจึงไม่ได้ การวาง VALUE SPACE บนโต๊ะ (ถ้าอยู่ใน LOCAL-STORAGE) จะเริ่มต้นตารางสองครั้งบนแต่ละ CALL ดังนั้นช้ากว่า
Bloat ไม่สามารถลบได้โดยไม่ต้องเขียนโปรแกรมใหม่ รหัสส่วนใหญ่ไม่ดี แต่มีเทคนิคที่มีประโยชน์อย่างหนึ่ง
นี่ไม่ใช่ตัวอย่างในชีวิตจริง แต่ฉันสามารถจินตนาการได้ว่ามีคนทำถ้าคนนั้นฉลาดพอ :-)
การรวบรวมไม่มีปัญหาเลย การวิ่งด้วยความเป็นไปได้ทุกอย่างจะพิสูจน์ได้อย่างรวดเร็วว่าไม่ควรลอง
แน่นอนว่ามี Bug ตัวเก่าแบบธรรมดาเช่นกัน งานที่พบบ่อยมากในงาน "ค้นหา"