这会使问题过于宽泛,无法处理所有事情,因此坚持以INSPECT
和PERFORM
为例。
WORKING-STORAGE SECTION.
01 THE-STRING PIC X(50).
01 A-HIGH-VALUE PIC X VALUE HIGH-VALUES.
01 A-SPACE PIC X VALUE SPACE.
PROCEDURE DIVISION.
INSPECT THE-STRING
REPLACING ALL SPACE
BY HIGH-VALUE
INSPECT THE-STRING
CONVERTING ' '
TO X'FF'
INSPECT THE-STRING
CONVERTING HIGH-VALUE
TO HIGH-VALUE
INSPECT THE-STRING
REPLACING ALL A-HIGH-VALUE
BY A-HIGH-VALUE
INSPECT THE-STRING
CONVERTING A-HIGH-VALUE
TO A-HIGH-VALUE
GOBACK
.
INSPECT有多种格式。以上包括两种格式,并使用文字,图形常量和数据名称。所有的INSPECT产生相同的结果。生成的代码...
000010 INSPECT
000544 DC31 8000 A12C TR 0(50,8),300(10) THE-STRING PGMLIT AT +292
000011 INSPECT
00054A DC31 8000 A12C TR 0(50,8),300(10) THE-STRING PGMLIT AT +292
000012 INSPECT
000550 DC31 8000 A12C TR 0(50,8),300(10) THE-STRING PGMLIT AT +292
000013 INSPECT
000556 D2FF D100 A02C MVC 256(256,13),44(10) TS2=0 PGMLIT AT +36
00055C 41E0 D100 LA 14,256(0,13) TS2=0
000560 1BFF SR 15,15
000562 BFF1 8038 ICM 15,1,56(8) A-HIGH-VALUE
000566 1AFE AR 15,14
000568 D200 F000 8040 MVC 0(1,15),64(8) A-SPACE
00056E DC31 8000 D100 TR 0(50,8),256(13) THE-STRING TS2=0
000014 INSPECT
000574 5820 905C L 2,92(0,9) TGTFIXD+92
000578 58F0 2044 L 15,68(0,2) V(IGZCIN1)
00057C 4110 A296 LA 1,662(0,10) PGMLIT AT +654
000580 0DEF BASR 14,15
可以看出,前三个例子(如编译器知道的值被改变,他们将被改变)都产生一个简单的TR,翻译,指令就性能而言,这绝对会让你在COBOL中可以编码的任何东西都变得面目全非。
第四个做一些工作(每次)为TR设置。第五个建立参数到运行时间例程(IGZCIN1),然后让该rip。
所有这些都会击败你的循环。随着该领域的规模扩大。
当然,如果你的领域很短,你有机会用简单的IFs获胜。
TR很快,但确实需要一个256字节的转换表。
大多数INSPECT是非常迅速的,和所有的动词一样,本质上知道所有事物的长度,所以没有机会为你自己编写一个“再见”。
有些网站愚蠢地“禁止”通过错误思维(或简单地说,不思考)使用INSPECT。 TALLYING所有字符可以被认为是缓慢的,但为什么要使用它?
现在,你的表演。如果你想成为高效,同时通过一些循环来看待每一个字节,不那样做:-)
PERFORM VARYING SUB1
FROM 1 BY 1
UNTIL SUB1 > 10
IF VARA(SUB1:1) = SPACE
MOVE HIGH-VALUE TO VARA(SUB1:1)
END-IF
END-PERFORM
你有“VARYING”,但什么变化?您正在查看10个字节。没有什么变化。哦,当然,它看起来更像是“代码”(来自其他语言),并且可以节省大量的输入。付费,每天付费:-)
MOVE ZERO TO SUB1
PERFORM LENGTH OF VARA TIMES
ADD 1 TO SUB1
IF VARA (SUB1 : 1) = SPACE
MOVE HIGH-VALUE TO VARA (SUB1 : 1)
END-IF
END-PERFORM
(我还没有做完整的格式,因为VARA是在那里,并参考修改...)
然后,假设您必须测试超过一个字节的内容,并决定使用带有INDEXED BY的OCCURS,因为它“更高效”。然而,使用文字,甚至是长文字,都会让你自己产生曲折的代码。这是因为编译器在将索引与文字进行比较时必须“对索引进行”归一化处理,所以必须将其从位移转换为用于比较的条目编号。你通过使用INDEXED BY获得了什么,因为松懈和使用VARYING而松动(可能是所有的,甚至更多)。为了获得更多普遍的感觉,不仅需要几种INSPECT格式的类型,还需要生成“伪汇编器”,了解它在做什么(至少在一般意义上)以及然后运行一些存根程序并实际比较所消耗的资源,然后键入以说明消耗的差异。
它不会一次全部到来,它是一个持续的过程,然后,当您到达Enterprise COBOL V5 +时,它会重新开始,因为一切都被更改:-)