在性能方面哪个更好? COBOL中的“if else”或“Evaluate”语句?

时间:2014-03-25 07:08:39

标签: cobol

在性能方面哪个更好? " if else"或" evaluate" COBOL中的陈述,当我们有较小的条件要检查时?

2 个答案:

答案 0 :(得分:7)

看起来我们有一个怀疑作为OP,所以这是IBM Enterprise 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 Mainframe Assembler,您只需要注意事情是相同的:

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   *     

CONTINUE,它不产生任何指令,用于保持IF和EVALUATE中“两条腿”的简单。

没有理由相信任何非IBM编译器生成的代码对于这两个示例会有所不同。

如果你不清楚你是否有能力回答问题或发表评论,那么当你鼓起勇气提出问题时,不要期待太多。

回到原来......

如果您在COBOL程序中遇到性能问题,则不太可能使用IF或EVALUATE 本身

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

如果找到旧的嵌套式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.

你可以知道这是旧代码,因为句号为句号。

新代码中的嵌套IF比EVALUATE好得多。

它们的使用之间应该没有真正的重叠,但从性能的角度来看,如果存在则没有问题。

我不知道所有编译器,但如果IF / ELSE生成相同的代码到简单的EVALUATE / WHEN / WHEN OTHER,我不会感到惊讶。

如果您遇到性能问题,请查看您的逻辑。

如果您正在考虑仅仅“优化”COBOL程序以使其更好一些,那就别忘了。获得逻辑直线且易于理解。使程序可维护。

如果你想知道让你的程序运行得更快(并且重点可能是一点),那么用一些不同类型的数字字段的操作来编写一些测试程序(USAGE DISPLAY) vs PACKED-DECIMAL / COMP-3与BINARY / COMP /编译器提供的各种其他非浮点COMP选项。

使用下标,计数,累计带小数位的值,多个来源的计算来检查它们。然后你就会知道如何根据他们的目的定义你的字段,之后不必考虑它。

如果您有自己的网站标准,请使用它们。

不要只编写COBOL程序,然后在他们工作时坐下来说“现在要优化它”。这不是我们的工作。

答案 1 :(得分:2)

这些差异在很大程度上是无关紧要的。过早优化通常不是一个好主意。

您的编译器将在编译时进行优化。在运行时,您的处理器将缓存执行率最高的代码或预测性地执行可能的路径。

编写源代码的方法是为将要跟随你的人类维护程序员编写代码,并且必须在0300生产时爆炸时查看所述程序。尽可能清楚地说明代码正在做什么。如果这意味着使用“IF”而不是“EVALUATE”,那么请为人类可读性而写。

只有在您投入生产并且您已使用真实世界数据分析代码时,您才应考虑调整性能。