在性能方面哪个更好?COBOL中的" if else"或" evaluate"声明,当我们有较小的条件进行检查时?
看来我们作为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
Run Code Online (Sandbox Code Playgroud)
这是生成的代码.您不需要了解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 *
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
或者,像这样:
IF A
do something
ELSE
IF B
do something
ELSE
IF C
do something
ELSE
IF D
do something
ELSE
IF E
do something.
Run Code Online (Sandbox Code Playgroud)
你可以知道它是旧代码,因为它的句号是句号.
新代码中的嵌套IF比EVALUATE好得多.
它们的使用之间应该没有真正的重叠,但从性能的角度来看,如果存在则没有问题.
我不知道所有编译器,但如果IF/ELSE生成相同的代码到简单的EVALUATE/WHEN/WHEN OTHER,我不会感到惊讶.
如果您遇到性能问题,请查看您的逻辑.
如果您正在考虑"优化"COBOL程序以使其更好,请忘记它.获得逻辑直线且易于理解.使程序可维护.
如果你想知道如何让你的程序运行得更快(并且重点可能稍微有点),那么用一些不同类型的数字字段的操作编写一些测试程序(USAGE DISPLAY vs PACKED-DECIMAL/COMP-3 vs BINARY/COMP /编译器提供的各种其他非浮点COMP选项.
使用下标,计数,累计带小数位的值,多个源的计算来检查它们.然后,您将知道如何定义字段以达到它们的目的,并且之后不必考虑它.
如果您有自己的站点标准,请使用它们.
不要只写一个COBOL程序,然后在他们工作时坐下来说"现在要优化它".这不是我们所做的.