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
.
Küçük bir bilgi tehlikeli bir şey olabilir.
Büyük bir karşılaştırmayı yapmak, birçok küçük karşılaştırmaya göre daha hızlı olabilir; IBM'in Enterprise COBOL (Sürüm 4.2'ye kadar) maksimum 128 MB ÇALIŞMA DEPOLAMA değeri olabilir (Sürüm 5.0 2 GB olabilir); Daha fazla alana ihtiyacınız olursa LOCAL-STORAGE, 128 MB daha sunar.
Görev, 11584 baytlık bir depolama parçasının "HELLO WORLD!" Değerine sahip olduğunu doğrulamak. bir yerlerde ve gerisi uzundur.
Hayali, programcı bunun için bir alt program yazmaya karar verir (başka bir yerde gerekli olması durumunda) ve yüksek performanslı tekniklerini (bonus) dahil etmeye karar verir.
Programcı, 11584 * 11584'ün 128 MB olduğunu hesaplar, bu nedenle devasa bir tablo için ÇALIŞMA DEPOLAMA ve gereken her şey için YEREL DEPOLAMA kullanılır.
Programcı kodlar ve derleme temiz olduğunda kendilerine bilerek gülümser. 128 MB hakkında haklıydılar.
Kodu test ediyor. İşe yarıyor. Muhtemelen biraz yavaş ama makinede ağır bir yük var. Yine gülümsüyor, uzmanlık bilgisi olmadan kodlanmanın ne kadar yavaş olacağını düşünüyor.
ÇALIŞMA-DEPOLAMA 134,189,056 baytta geliyor ve başka birkaç iyi bayt var. Yeterince büyük olmalı.
Gerçek şu ki, kısa bir karşılaştırma yerine uzun bir karşılaştırma yapmanın, burada uygulandığı gibi, bunu yapmanın çok yavaş bir yoludur.
Daha yavaş olsa da, bir alt program çağrıldığında çalışma zamanı rutinleri tarafından başlatılan LOCAL-STORAGE, her CALL için ayarlanmış 128 MB'ın tamamına neden olur.
Programcı tablonun büyüklüğü ile ilgili olarak açıkça yanlış, YEREL DEPOLAMA kullanmadan yeterli yer var. Uzun karşılaştırmalar kısa karşılaştırmaları geçebilir, ancak yalnızca gerçek karşılaştırma sayısı azaldığında.
YEREL DEPOLAMA ve ÇALIŞMA-DEPOLAMA takas etmeyi düşündüm, birinin bu şekilde kodlaması çok azdı, bu yüzden yapmadım. Masanın üzerine bir DEĞER YERİ koymak (eğer YEREL DEPOLAMA'da olsaydı) , her ÇAĞRI üzerinde tabloyu iki kez başlatırdı, hatta daha yavaş.
Bloat, programı yeniden yazmadan kaldırılamaz. Kodun çoğu kötü, ancak kullanışlı bir teknik var.
Bu gerçek hayattan bir örnek değil, ancak yeterince zeki biri varsa, birinin yaptığını hayal edebiliyorum.
Derleme hiç sorun değil. Her olasılıkla hızlı bir şekilde çalıştırmak, denemeye değer olmadığını kanıtlar.
Tabii ki, düz eski bir böcek de var. "Arama" görevlerinde çok yaygın olanı.