Bạc hà
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
.
Một chút kiến thức có thể là một điều nguy hiểm.
Có thể nhanh hơn để thực hiện một so sánh lớn hơn rất nhiều so sánh nhỏ; Enterprise COBOL của IBM (tối đa Phiên bản 4.2) có thể có BẢO QUẢN LÀM VIỆC tối đa là 128 MB (Phiên bản 5.0 có thể có 2GB); ĐỊA ĐIỂM-BẢO QUẢN cung cấp thêm 128 MB nếu bạn cần thêm dung lượng.
Nhiệm vụ là xác nhận rằng một bộ lưu trữ 11584 byte có giá trị "HELLO WORLD!" ở đâu đó, và phần còn lại là không gian.
Lập trình viên hư cấu, quyết định viết một chương trình con cho việc này (chỉ trong trường hợp cần thiết ở nơi khác) và bao gồm kỹ thuật hiệu suất cao (tiền thưởng) của họ.
Lập trình viên tính toán rằng 11584 * 11584 là 128 MB, do đó, sử dụng CÔNG VIỆC-BẢO QUẢN cho một bảng lớn và LƯU TRỮ ĐỊA PHƯƠNG cho mọi thứ khác cần thiết.
Lập trình viên mã hóa nó và mỉm cười với chính họ khi biên dịch sạch sẽ. Họ đã đúng về 128MB.
Kiểm tra mã. Nó hoạt động. Có thể hơi chậm, nhưng có một tải nặng trên máy. Lại mỉm cười, nghĩ sẽ chậm đến mức nào nếu được mã hóa mà không có kiến thức chuyên môn.
CÔNG CỤ-BẢO QUẢN có đến 134.189.056 byte và cũng có một vài byte tốt khác. Nên đủ lớn.
Thực tế là làm một so sánh dài thay vì so sánh ngắn, như được thực hiện ở đây, là một cách rất chậm để làm điều đó.
Thậm chí chậm hơn, LƯU TRỮ ĐỊA PHƯƠNG, được khởi tạo bởi các thói quen thời gian chạy mỗi khi chương trình con được gọi, khiến toàn bộ 128 MB được thiết lập cho mỗi CALL.
Các lập trình viên chỉ đơn giản là sai về kích thước của bảng, có đủ chỗ mà không cần sử dụng ĐỊA PHƯƠNG. So sánh dài có thể đánh bại so sánh ngắn, nhưng chỉ khi số lượng so sánh thực tế giảm.
Tôi đã cân nhắc việc hoán đổi ĐỊA ĐIỂM-BẢO QUẢN và LÀM VIỆC-BẢO QUẢN xung quanh, rất ít khả năng ai đó sẽ viết mã theo cách đó, vì vậy tôi đã không làm vậy. Đặt một KHÔNG GIAN GIÁ TRỊ trên bàn (nếu nó đã ở trong ĐỊA ĐIỂM-BẢO QUẢN) sẽ khởi tạo bảng hai lần trên mỗi GỌI, do đó thậm chí còn chậm hơn.
Bloat không thể được gỡ bỏ, mà không cần viết lại chương trình. Hầu hết các mã là xấu, mặc dù có một kỹ thuật hữu ích.
Đây không phải là một ví dụ thực tế, nhưng tôi có thể tưởng tượng ai đó đang làm điều đó, nếu người đó đủ thông minh :-)
Biên dịch là không có vấn đề gì cả. Chạy nó với mọi khả năng nhanh chóng chứng tỏ là không đáng để thử.
Tất nhiên, có một Bug cũ đơn giản là tốt. Một cái rất phổ biến trong các nhiệm vụ "tìm kiếm".