कोबोल
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
.
थोड़ा सा ज्ञान एक खतरनाक चीज हो सकती है।
यह एक छोटी तुलना की तुलना में एक बड़ी करने के लिए तेज़ हो सकता है; आईबीएम के एंटरप्राइज COBOL (संस्करण 4.2 तक) में अधिकतम 128MB का काम हो सकता है (संस्करण 5.0 में 2GB हो सकता है); यदि आपको अधिक स्थान की आवश्यकता है तो LOCAL-STORAGE आगे 128MB प्रदान करता है।
कार्य यह पुष्टि करने के लिए है कि 11584-बाइट भंडारण के मूल्य का मूल्य "हेलो वर्ल्ड!" है। कहीं और, बाकी जगह है।
काल्पनिक, प्रोग्रामर इसके लिए एक उप-प्रोग्राम लिखने का फैसला करता है (बस मामले में यह कहीं और आवश्यक है), और उनकी उच्च-प्रदर्शन तकनीक (बोनस) को शामिल करने के लिए।
प्रोग्रामर यह गणना करता है कि 11584 * 11584 128MB है, इसलिए एक विशाल टेबल के लिए WORKING-STORAGE का उपयोग करता है, और LOCAL-STORAGE के लिए अन्य सभी चीजों की आवश्यकता होती है।
प्रोग्रामर इसे कोड करता है, और संकलन के साफ होने पर खुद को जानकर मुस्कुराता है। वे 128 एमबी के बारे में सही थे।
कोड का परीक्षण करता है। यह काम करता हैं। संभवतः थोड़ा धीमा है, लेकिन मशीन पर भारी भार है। फिर से मुस्कुराते हुए, यह सोचकर कि यदि उनके विशेषज्ञ ज्ञान के स्तर के बिना कोड किया जाता है तो यह कितना धीमा होगा।
वर्किंग-स्टोरेज 134,189,056 बाइट्स में आता है, और साथ ही अन्य सामान की कुछ अच्छी बाइट्स भी है। काफी बड़ा होना चाहिए।
वास्तविकता यह है कि एक छोटी तुलना के बजाय एक लंबी तुलना करना, जैसा कि यहां लागू किया गया है, इसे करने का एक बहुत धीमा तरीका है।
यहां तक कि धीमी गति से, LOCAL-STORAGE, जो हर बार उप-प्रोग्राम को रन-टाइम रूटीन द्वारा आरम्भ किया जाता है, प्रत्येक CALL के लिए पूरे 128MB को सेट करने का कारण बनता है।
प्रोग्रामर सिर्फ टेबल के आकार के बारे में गलत था, LOCAL-STORAGE का उपयोग किए बिना पर्याप्त जगह है। लंबी तुलना छोटी तुलना को हरा सकती है, लेकिन केवल तभी जब तुलना की वास्तविक संख्या कम हो।
मैंने LOCAL-STORAGE और WORKING-STORAGE की अदला-बदली पर विचार किया, यह बहुत कम संभावना है कि कोई इसे इस तरह से राउंड कोड करेगा, इसलिए मैंने नहीं किया। टेबल पर वैल्यू स्पेस डालना (यदि यह LOCAL-STORAGE में होता तो) दो बार टेबल पर होता। प्रत्येक CALL पर , तो भी धीमा।
कार्यक्रम को दोबारा लिखे बिना ब्लोट को हटाया नहीं जा सकता। अधिकांश कोड खराब है, हालांकि एक उपयोगी तकनीक है।
यह एक वास्तविक जीवन का उदाहरण नहीं है, लेकिन मैं किसी को यह करने की कल्पना कर सकता हूं, अगर वह कोई बहुत चालाक है :-)
संकलन करना कोई समस्या नहीं है। हर संभावना के साथ इसे चलाना तेजी से प्रयास के लायक नहीं साबित होता है।
बेशक, एक बूढ़ा बग भी है। "खोज" कार्यों में एक बहुत ही सामान्य।