2017-04-13 68 views
2

除了僅僅運行頻閃或在作業結束時檢查CPU的使用情況之外,還有什麼方法可以確定哪些COBOL動詞更佔用CPU資源?就拿這個例子:有沒有辦法說出哪些動詞更高效

難道是更有效地使用這種檢查的語句(假設VARA是PIC X(10))

INSPECT VARA REPLACING ALL SPACE 
         BY HIGH-VALUE 

,或者它會更好,寫一個循環

PERFORM VARYING SUB1 
     FROM 1 BY 1 
     UNTIL SUB1 > 10 
    IF VARA(SUB1:1) = SPACE 
     MOVE HIGH-VALUE TO VARA(SUB1:1) 
    END-IF 
END-PERFORM 

背景

我有一些程序,正在處理的文件數以百萬計的記錄和一些工作沒有完成以及我們想要的。我試圖分析長時間運行的工作,並找到加速它們的非侵入式方法(如上面更改循環檢查的示例)。唯一的問題是,我實際上並不知道什麼是更高效的。我們不想爲改變而改變,但如果我能夠以某種方式說出改變會提高性能,我們幾乎肯定會這樣做。

我使用Z/OS 2.01.00和COBOL針對z/OS 4.2.0

回答

1

這會使問題過於寬泛,無法處理所有事情,因此堅持以INSPECTPERFORM爲例。

WORKING-STORAGE SECTION. 
    01 THE-STRING       PIC X(50). 
    01 A-HIGH-VALUE      PIC X VALUE HIGH-VALUES. 
    01 A-SPACE        PIC X VALUE SPACE. 

    PROCEDURE DIVISION. 
     INSPECT THE-STRING 
     REPLACING     ALL SPACE 
            BY HIGH-VALUE 
     INSPECT THE-STRING 
     CONVERTING     ' ' 
            TO X'FF' 
     INSPECT THE-STRING 
     CONVERTING     HIGH-VALUE 
            TO HIGH-VALUE 
     INSPECT THE-STRING 
     REPLACING     ALL A-HIGH-VALUE 
            BY A-HIGH-VALUE 
     INSPECT THE-STRING 
     CONVERTING     A-HIGH-VALUE 
            TO A-HIGH-VALUE 
     GOBACK 
     . 

INSPECT有多種格式。以上包括兩種格式,並使用文字,圖形常量和數據名稱。所有的INSPECT產生相同的結果。生成的代碼...

000010 INSPECT                         
    000544 DC31 8000 A12C   TR 0(50,8),300(10)   THE-STRING      PGMLIT AT +292 

000011 INSPECT                         
    00054A DC31 8000 A12C   TR 0(50,8),300(10)   THE-STRING      PGMLIT AT +292 

000012 INSPECT                         
    000550 DC31 8000 A12C   TR 0(50,8),300(10)   THE-STRING      PGMLIT AT +292 

000013 INSPECT                         
    000556 D2FF D100 A02C   MVC 256(256,13),44(10)  TS2=0        PGMLIT AT +36 
    00055C 41E0 D100    LA 14,256(0,13)   TS2=0           
    000560 1BFF     SR 15,15                 
    000562 BFF1 8038    ICM 15,1,56(8)    A-HIGH-VALUE          
    000566 1AFE     AR 15,14                 
    000568 D200 F000 8040   MVC 0(1,15),64(8)   A-SPACE           
    00056E DC31 8000 D100   TR 0(50,8),256(13)   THE-STRING      TS2=0   

000014 INSPECT                         
    000574 5820 905C    L  2,92(0,9)    TGTFIXD+92          
    000578 58F0 2044    L  15,68(0,2)    V(IGZCIN1)          
    00057C 4110 A296    LA 1,662(0,10)    PGMLIT AT +654         
    000580 0DEF     BASR 14,15                 

可以看出,前三個例子(如編譯器知道的值被改變,他們將被改變)都產生一個簡單的TR,翻譯,指令就性能而言,這絕對會讓你在COBOL中可以編碼的任何東西都變得面目全非。

第四個做一些工作(每次)爲TR設置。第五個建立參數到運行時間例程(IGZCIN1),然後讓該rip。

所有這些都會擊敗你的循環。隨着該領域的規模擴大。

當然,如果你的領域很短,你有機會用簡單的IFs獲勝。

TR很快,但確實需要一個256字節的轉換表。

大多數INSPECT是非常迅速的,和所有的動詞一樣,本質上知道所有事物的長度,所以沒有機會爲你自己編寫一個「再見」。

有些網站愚蠢地「禁止」通過錯誤思維(或簡單地說,不思考)使用INSPECT。 TALLYING所有字符可以被認爲是緩慢的,但爲什麼要使用它?

現在,你的表演。如果你想成爲高效,同時通過一些循環來看待每一個字節,不那樣做:-)

PERFORM VARYING SUB1 
     FROM 1 BY 1 
     UNTIL SUB1 > 10 
    IF VARA(SUB1:1) = SPACE 
     MOVE HIGH-VALUE TO VARA(SUB1:1) 
    END-IF 
END-PERFORM 

你有「VARYING」,但什麼變化?您正在查看10個字節。沒有什麼變化。哦,當然,它看起來更像是「代碼」(來自其他語言),並且可以節省大量的輸入。付費,每天付費:-)

MOVE ZERO TO SUB1 
PERFORM LENGTH OF VARA TIMES 
    ADD 1 TO SUB1 
    IF VARA (SUB1 : 1) = SPACE 
     MOVE HIGH-VALUE TO VARA (SUB1 : 1) 
    END-IF 
END-PERFORM 

(我還沒有做完整的格式,因爲VARA是在那裏,並參考修改...)

然後,假設您必須測試超過一個字節的內容,並決定使用帶有INDEXED BY的OCCURS,因爲它「更高效」。然而,使用文字,甚至是長文字,都會讓你自己產生曲折的代碼。這是因爲編譯器在將索引與文字進行比較時必須「對索引進行」歸一化處理,所以必須將其從位移轉換爲用於比較的條目編號。你通過使用INDEXED BY獲得了什麼,因爲鬆懈和使用VARYING而鬆動(可​​能是所有的,甚至更多)。爲了獲得更多普遍的感覺,不僅需要幾種INSPECT格式的類型,還需要生成「僞彙編器」,瞭解它在做什麼(至少在一般意義上)以及然後運行一些存根程序並實際比較所消耗的資源,然後鍵入以說明消耗的差異。

它不會一次全部到來,它是一個持續的過程,然後,當您到達Enterprise COBOL V5 +時,它會重新開始,因爲一切都被更改:-)

2

編譯器優化了高度的事情,所以一個良好的起點,將確保所有的被打開。既然你提到了Strobe,我會假設你有它可用。它會給你報告哪些代碼段佔用你大部分時間,通常情況下,它不是你期望的那樣,所以我會說運行這些報告,看看哪些動詞導致你的問題,並嘗試其他方法完成同樣的事情。

在上面的例子中,INSPECT語句應該變成非常快的TR指令。但編譯器可以通過展開它並將其轉化爲非常快速的CLI/MVI語句系列,甚至可能是相同的TR指令,從而優化PERFORM循環。

很可能,這些都不會是你的問題。你也可以看看你正在處理的文件,並確保它們被正確地封鎖和緩衝,所有這些,通常你可以得到一些好的銀行,在那裏進行調整。

3

如果可能且可行,我們將使用我們商店的供應商實用程序而不是編寫COBOL。例如,SORT實用程序通常針對I/O進行高度優化,並且性能非常好。

There 可能是可維護性和效率之間的權衡。有人認爲COBOL比SORT控制卡更易於理解和調試。我認爲這取決於要完成的任務的性質。

我決策樹是:

  1. 試圖實現與供應商的事業目標
  2. 如果不能合理地做,然後嘗試使用現有的通用子程序
  3. 寫自定義 代碼來完成目標定製代碼,試圖創建通用子程序,其中 可用於未來的類似情況

對於#2中的「合理」,一位同事在3個工作步驟中會放棄供應商公用事業。我的限制更高。你自己的收益遞減規則將取決於許多因素。

相關問題