COBOL - Ajuste de Desempenho
- Evite usos repetitivos da instrução INITIALIZE. INITIALIZE uma vez e mova-o para um segundo nível 01 de tamanho semelhante, depois mova o segundo nível 01 para o primeiro para inicializar os campos.
Aqui está uma maneira melhor de INITIALIZATION de um item de registro ou grupo.
INITIALIZE WS-RECORD
REPLACING ALPHANUMERIC DATA BY SPACES
NUMERIC DATA BY ZEROES. |
- Considere usar um PERFORM em linha em vez de um SEARCH quando você tiver menos de 20 elementos em uma tabela.
- Em geral, é uma vantagem usar COMP para dados numéricos e COMP-3 para dados decimais.
- Considerações de desempenho para tipos de dados
- PACKED-DECIMAL (COMP-3): Use 15 ou poucos dígitos na cláusula PIC para evitar o uso de rotinas de biblioteca.
- Sempre codifique um número ímpar de dígitos!
- Ao realizar aritmética, sempre use os campos numéricos assinados.
» O COBOL funciona mais rápido com campos assinados do que campos não assinados.
- Especifique SYNC para itens BINARY.
- Use itens de dados assinados com 8 ou menos dígitos - [S9(8)BINARY SYNC]
» 9 ou mais dígitos é mais lento
» 18 dígitos é mais lento
- Evite USAGE IS DISPLAY para campos numéricos [ PIC S99].
- Considerações de desempenho para constantes e variáveis
- Use os campos BINARY do PIC S9(8) para variáveis de controle de loop.
- Inicialize as constantes com uma cláusula de valor e não as modifique ou passe por referência (compilar otimizará as constantes).
- Considerações de desempenho para tabelas
- O uso de tabelas de comprimento variável é 5% mais lento do que o uso de uma tabela de comprimento fixo.
- Usar uma tabela de comprimento variável que faz referência ao primeiro elemento ODO complexo (Occurs Depending On) é 7% mais lento do que usar uma tabela de comprimento fixo.
- Considerações de desempenho para índices e subscritos
- Índices são mais rápidos que subscritos.
- Se você selecionar subscritos, o código S9(8) BINARY SYNC outras cláusulas de uso como COMP,COMP-3 e DISPLAY resultarão em desempenho inferior.
- Ao fazer referência a tabelas sequencialmente, fazer com que o subscrito mais à esquerda varie com mais frequência pode ser 50% mais lento do que fazer com que o subscrito mais à direita varie com mais frequência.
- A pesquisa binária na tabela (usando SEARCH ALL) é mais rápida que a pesquisa linear (SEARCH).
- Considerações de Desempenho para Declaração de CALL
- Chamada literal (chamada estática) mais rápido que literal de chamada dinâmica.
Exemplo:
CALL ‘PROGRAMA’ - chamda estática
|
é mais rápido que
01 WS-PGM PIC X(08).
MOVE ‘PROGRAMA’ to WS-PGM.
CALL WS-PGM - Chamada dinâmica
|
- Chamadas aninhadas são mais rápidas que chamadas estáticas. Porque quando um programa COBOL chama um programa aninhado, o CALL é resolvido pelo compilador sem qualquer intervenção do sistema.
- IS INITIAL no PROGRAM-ID pode ser muito penalizador em termos de tempo.
- Considerações de desempenho para arquivos QSAM
- Para permitir que o sistema operacional OS/390 otimize seu código de tamanho de bloco
- BLOCO CONTÉM 0 RECORDS na seção FD do programa COBOL
- E BLKSIZE = 0 em DCB no JCL
- Ao realizar aritmética, sempre use campos numéricos assinados. COBOL executa mais rápido com campos assinados do que campos não assinados.
- Ao gravar em arquivos sequenciais bloqueados de comprimento variável, use a cláusula APPLY WRITE-ONLY para o arquivo ou use a opção do compilador AWO. Isso pode reduzir o número de chamadas para o Data Management Services para lidar com as E/Ss.
- Se você usa SEARCH em COBOL, é melhor usar SEARCH ALL (busca binária).
- Usar índices para endereçar uma tabela é mais eficiente do que usar subscritos, pois o índice já contém o deslocamento do início da tabela e não precisa ser calculado em tempo de execução.
- Para variáveis de controle de loop, use itens de dados binários.
Considerações de desempenho para variáveis de controle de loop (PIC S9(8)):
- usar um decimal (COMP-3) é 320% mais lento do que usar um binário (COMP)
- usar um DISPLAY é 890% mais lento do que usar binário (COMP)
- Se você estiver acessando o arquivo sequencialmente, é bom mencionar BLOCK CONTAINS 0 RECORDS no FD e BLKSIZE = 0 no DCB.
Além disso, muitas opções do compilador têm implicações de desempenho de longo alcance no programa durante a execução, especialmente as opções ARITH, AWO, DYNAM, FASTSRT, NUMPROC, OPTIMIZE, RENT, SSRANGE, TEST, THREAD e TRUNC.
Abaixo está a explicação para cada uma das opções do compilador mencionadas acima e como elas afetam o desempenho:-
ARITH - EXTEND ou COMPAT:
A opção do compilador ARITH permite controlar o número máximo de dígitos permitidos para variáveis numéricas em seu programa.ARITH(EXTEND ), o número máximo de dígitos é 31 - Mais lento. ARITH(COMPAT), o número máximo de dígitos é 18 - Mais rápido.
AWO ou NOAWO :
APLICAR processamento APENAS ESCRITA para arquivos sequenciais físicos com formato VB.
APPLY WRITE-ONLY , o buffer de arquivo é gravado no dispositivo de saída quando não há espaço suficiente no buffer para o próximo registro. Sem APPLY WRITE-ONLY, o buffer de arquivo é gravado no dispositivo de saída quando não há espaço suficiente no buffer para o registro de tamanho máximo.
Se o aplicativo tiver uma grande variação no tamanho dos registros a serem gravados, o uso de APPLY WRITE-ONLY pode resultar em uma economia de desempenho, pois isso geralmente resultará em menos chamadas de E/S.
NOAWO é o padrão.
DATA(24) ou DATA(31) :
Especifica se as áreas de dados do programa reentrantes residem acima ou abaixo da linha de 16 MB. Com DATA(24), os programas reentrantes devem residir abaixo da linha de 16 MB. Com DATA(31) os programas reentrantes podem residir acima da linha de 16 MB.
DATA(31) é o padrão.
DYNAM ou NODYNAM :
DYNAM ,Altera o comportamento das instruções literais CALL para carregar subprogramas dinamicamente em tempo de execução. O comprimento do caminho de chamada é mais longo - instruções literais NODYNAM ,CALL mais lentas fazem com que os subprogramas sejam editados estaticamente por link no módulo de carregamento. O comprimento do caminho da chamada é - mais rápido.
NODYNAM é o padrão.
FASTSRT ou NOFASTSRT :
FASTSRT ,Especifica a classificação rápida pelo programa licenciado IBM DFSORT. - FasterNOFATSRT ,Especifica que Enterprise COBOL fará SORT ou MERGE entrada/saída
NOFASTSRT é o padrão
NUMPROC - NOPFD, MIG, or PFD :
Handles packed/zoned decimal signs as follows:
NUMPROC(NOPFD), sign fix-up processing is done for all references to these numeric data items. NUMPROC(MIG), sign fix-up processing is done only for receiving fields (and not for sendingfields) of arithmetic and MOVE statements. NUMPROC(PFD), the compiler assumes that the data has the correct sign and bypasses this sign fix-up processing.
For performance sensitive applications, NUMPROC(PFD) is recommended when possible.
NUMPROC(NOPFD) is the default.
OPTIMIZE(STD), OPTIMIZE(FULL), or NOOPTIMIZE :
Optimizes the object program. OPTIMIZE has the suboptions of (STD/FULL).
OPTIMIZE(FULL) provides improved runtime performance, over both the OS/VS COBOL and VS COBOL II OPTIMIZE option, because the compiler discards unused data items and does not generate code for any VALUE clauses for these data items.
NOOPTIMIZE is generally used while a program is being developed when frequent compiles arenecessary. NOOPTIMIZE also makes it easier to debug a program since code is not moved;
NOOPTIMIZE is the default.
RENT or NORENT :
Using the RENT compiler option causes the compiler to generate some additional code to ensure that the program is reentrant.
On the average, RENT was equivalent to NORENT.
RENT is the default.
RMODE - AUTO, 24, or ANY :
Allows NORENT programs to have RMODE(ANY).
When using NORENT, the RMODE option controls where the WORKING-STORAGE will reside.With RMODE(24), the WORKING-STORAGE will be below the 16 MB line. With RMODE(ANY), theWORKING-STORAGE can be above the 16 MB line.
RMODE(AUTO) is the default.
SSRANGE or NOSSRANGE :
SSRANGE - At run time, checks validity of subscript, index, and reference modification references. Its slower than NOSSRANGE.
NOSSRANGE is the default.
TEST or NOTEST :
TEST - Produces object code usable by Debug Tool for the product. It is slower than NOTEST.
NOTEST is the default.
THREAD or NOTHREAD :
THREAD -Enables a COBOL program for execution in a run unit with multiple POSIX threads or PL/I tasks. It is slower than NOTHREAD.
NOTHREAD is the default.
TRUNC - BIN, STD, or OPT :
Truncates final intermediate results.
TRUNC(STD) Truncates numeric fields according to PICTURE specification of the binary receiving field TRUNC(OPT) Truncates numeric fields in the most optimal way TRUNC(BIN) Truncates binary fields based on the storage they occupy
on an average performance analysis - TRUNC(OPT) > TRUNC(STD) > TRUNC(BIN)
TRUNC(STD) is the default.