2014-03-25 163 views

回答

7

看來,我們有一個懷疑者爲OP,所以這裏與IBM的企業COBOL一個例子:

01 A PIC 9. 
    PROCEDURE DIVISION. 
     ACCEPT A 
     IF A EQUAL TO 2 
      CONTINUE 
     ELSE 
      CONTINUE 
     END-IF 
     EVALUATE A 
      WHEN 2 
      CONTINUE 
      WHEN OTHER 
      CONTINUE 
     END-EVALUATE 

這裏是它生成的代碼。你不需要知道IBM大型機彙編,你就必須要注意的事情是相同的:

000008 IF                  
    0002F8 D200 D0F8 8000   MVC 248(1,13),0(8)   TS2=0   
    0002FE 96F0 D0F8    OI 248(13),X'F0'   TS2=0   
    000302 95F2 D0F8    CLI 248(13),X'F2'   TS2=0   
    000306 4770 B126    BC 7,294(0,11)    GN=4(00030E) 
000009 CONTINUE                
    00030A 47F0 B126    BC 15,294(0,11)   GN=5(00030E) 
    00030E     GN=4  EQU *          
000011 CONTINUE                
    00030E     GN=5  EQU *          
000013 EVALUATE                
000014 WHEN                 
    00030E D200 D0F8 8000   MVC 248(1,13),0(8)   TS2=0   
    000314 96F0 D0F8    OI 248(13),X'F0'   TS2=0   
    000318 95F2 D0F8    CLI 248(13),X'F2'   TS2=0   
    00031C 4770 B13C    BC 7,316(0,11)    GN=12(000324) 
000015 CONTINUE                
    000320 47F0 B13C    BC 15,316(0,11)   GN=11(000324) 
    000324     GN=12 EQU *          
000016 WHEN                 
000017 CONTINUE                
    000324     GN=11 EQU *  

持續,這不產生指令,用於在IF讓事情變得簡單了兩個「腿」和評估。

沒有理由相信任何非IBM編譯器生成的代碼在這兩個示例中會有所不同。

如果你還沒有精力來回答問題或者如果你不清楚的時候發表評論,那麼當你召喚能量問問題時,不要期望太多。

回到原來...

如果在COBOL程序有性能問題,這是極不可能將下降到使用中頻或評估本身

EVALUATE可以用作嵌套IF的直接替代。

如果你發現一箇舊巢式是否會是這個樣子:

IF A 
    do something 
ELSE 
    IF B 
     do something 
    ELSE 
     IF C 
      do something 
     ELSE 
      IF D 
       do something 
      ELSE 
       IF E 
        do something. 

或者,像這樣:

IF A 
    do something 
ELSE 
IF B 
    do something 
ELSE 
IF C 
    do something 
ELSE 
IF D 
    do something 
ELSE 
IF E 
    do something. 

你可以知道這是舊代碼,完整的,因爲停/期。

新代碼中的嵌套-IFs與EVALUATE相比更好。

它們的用法之間應該沒有真正的重疊,但從性能的角度來看,如果存在的話,它不是問題。

我不知道所有的編譯器,但如果一個IF/ELSE生成相同的代碼來執行簡單的EVALUATE/WHEN/WHEN時,我不會感到驚訝。

如果您有性能問題,請關注您的邏輯。

如果你正在考慮只是「優化」一個COBOL程序,讓它變得更好,那就把它忘掉吧。獲得邏輯直接和可以理解。使程序可維護。

如果您想了解讓你的程序運行快一點(和重點只可能是有點),然後寫不同類型的數字字段的一些操作一些測試程序(利用率顯示VS填充DECIMAL/COMP-3與BINARY/COMP /編譯器提供的各種其他非浮點COMP選項)。

檢查他們與下標,計數,累積值與小數位,多個來源的計算。然後你就會知道如何定義你的領域以達到他們的目的,並且不必在事後再考慮。

如果您有現場標準,請使用它們。

不要只編寫一個COBOL程序,然後坐下來,然後說「現在優化它」。這不是我們所做的。

2

這些差異在很大程度上是不相關的。不成熟的優化通常不是一個好主意。

編譯器會在編譯時優化兩者。在運行時,你的處理器會緩存最高執行代碼或者預測執行可能的路徑。

編寫源代碼的方法是編寫人員維護程序員,這些程序員會在你遇到並且在生產中炸開時看到0300上的程序。儘可能清楚代碼的作用。如果這意味着使用「IF」而不是「EVALUATE」,那麼請寫出可讀性。

只有當您進入生產環境並且您已經使用真實世界的數據對您的代碼進行了剖析時,纔會考慮調整性能。

+1

Upvote for'usually'並避免Knuth通常的部分錯誤引用。 COBOL程序大部分時間都用於I/O,其餘大部分時間用在MOVE語句中。 – EJP