就性能而言,哪一个更好?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语句。