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



哪个性能更好?" if else "或" evaluate "语句,当我们有较小的检查条件时

作为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 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 vs . BINARY/COMP/编译器提供的各种其他非浮点COMP选项)。

查看它们与下标,计数,累积值与小数点,计算与多个来源。然后,您将知道如何根据字段的目的定义字段,之后就不必再考虑它了。

如果你所在的地方有站点标准,请使用它们。

不要只是写一个COBOL程序,然后在它们工作后坐下来说"现在要优化它"。这不是我们做的。

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

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

编写源代码的方法是为人类维护程序员编写代码,他们将在0300在生产环境中出现问题时查看所述程序。尽可能清楚地说明代码的作用。如果这意味着使用" If "而不是"EVALUATE",那么就这样做吧,为了人类的可读性而写。

只有当你进入生产环境,并且你已经用真实世界的数据分析了你的代码,你才应该考虑调整性能

最新更新