就性能而言,哪一个更好?COBOL中的“if-else”或“Evaluate”语句?

就性能而言,哪一个更好?COBOL中的“if-else”或“Evaluate”语句?,cobol,Cobol,就性能而言,哪一个更好? if else或evaluate语句在COBOL中,当我们需要检查的条件较少时?似乎我们有一个怀疑者作为OP,下面是IBM Enterprise COBOL的一个示例: 01 A PIC 9. PROCEDURE DIVISION. ACCEPT A IF A EQUAL TO 2 CONTINUE ELSE CONTINUE

就性能而言,哪一个更好?
if else或evaluate语句在COBOL中,当我们需要检查的条件较少时?

似乎我们有一个怀疑者作为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 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 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-OTHER生成的代码相同,我也不会感到惊讶

如果您有性能问题,请查看您的逻辑

如果你只是想优化一个COBOL程序,让它变得更好,那就忘掉它吧。把逻辑弄清楚,让人理解。使程序可维护

如果你想知道如何让你的程序运行得更快,重点可能在一点上,那么就编写一些测试程序,对不同类型的数字字段进行一些操作,使用DISPLAY vs PACKED-DECIMAL/COMP-3 vs BINARY/COMP/编译器提供的各种其他非浮点COMP选项

通过下标、计数、小数点后的累积值、使用多个源进行计算来检查它们。然后,你就知道如何定义他们的领域,而不必事后考虑。 如果您所在的位置有站点标准,请使用它们


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

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

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

编写源代码的方法是为后续的人工维护程序员编写,当程序在生产中崩溃时,他们必须在0300时查看该程序。尽可能清楚地说明代码在做什么。如果这意味着使用If而不是EVALUATE,那么就这样做,为人类可读性而写


只有当您投入生产并使用真实数据分析了代码时,您才应该考虑调整性能。

哪家COBOL供应商?哪一个操作系统?投票支持“通常”,并避免从Knuth通常的部分错误引用。COBOL程序大部分时间用于I/O,其余大部分时间用于MOVE语句。