2017-04-13 89 views
2

除了仅仅运行频闪或在作业结束时检查CPU的使用情况之外,还有什么方法可以确定哪些COBOL动词更占用CPU资源?就拿这个例子:有没有办法说出哪些动词更高效

难道是更有效地使用这种检查的语句(假设VARA是PIC X(10))

INSPECT VARA REPLACING ALL SPACE 
         BY HIGH-VALUE 

,或者它会更好,写一个循环

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 

背景

我有一些程序,正在处理的文件数以百万计的记录和一些工作没有完成以及我们想要的。我试图分析长时间运行的工作,并找到加速它们的非侵入式方法(如上面更改循环检查的示例)。唯一的问题是,我实际上并不知道什么是更高效的。我们不想为改变而改变,但如果我能够以某种方式说出改变会提高性能,我们几乎肯定会这样做。

我使用Z/OS 2.01.00和COBOL针对z/OS 4.2.0

回答

1

这会使问题过于宽泛,无法处理所有事情,因此坚持以INSPECTPERFORM为例。

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 +时,它会重新开始,因为一切都被更改:-)

2

编译器优化了高度的事情,所以一个良好的起点,将确保所有的被打开。既然你提到了Strobe,我会假设你有它可用。它会给你报告哪些代码段占用你大部分时间,通常情况下,它不是你期望的那样,所以我会说运行这些报告,看看哪些动词导致你的问题,并尝试其他方法完成同样的事情。

在上面的例子中,INSPECT语句应该变成非常快的TR指令。但编译器可以通过展开它并将其转化为非常快速的CLI/MVI语句系列,甚至可能是相同的TR指令,从而优化PERFORM循环。

很可能,这些都不会是你的问题。你也可以看看你正在处理的文件,并确保它们被正确地封锁和缓冲,所有这些,通常你可以得到一些好的银行,在那里进行调整。

3

如果可能且可行,我们将使用我们商店的供应商实用程序而不是编写COBOL。例如,SORT实用程序通常针对I/O进行高度优化,并且性能非常好。

There 可能是可维护性和效率之间的权衡。有人认为COBOL比SORT控制卡更易于理解和调试。我认为这取决于要完成的任务的性质。

我决策树是:

  1. 试图实现与供应商的事业目标
  2. 如果不能合理地做,然后尝试使用现有的通用子程序
  3. 写自定义 代码来完成目标定制代码,试图创建通用子程序,其中 可用于未来的类似情况

对于#2中的“合理”,一位同事在3个工作步骤中会放弃供应商公用事业。我的限制更高。你自己的收益递减规则将取决于许多因素。

相关问题