BINARY (COMP ou COMP-4)
Os dados BINÁRIOS e os sinônimos COMP e COMP-4 são a representação dos dados em complemento de dois em COBOL.
Os dados BINARY são declarados com uma cláusula PICTURE como dados decimais internos ou externos, mas a representação de dados subjacente é como uma meia-palavra (2 bytes), uma palavra inteira (4 bytes) ou uma palavra dupla (8 bytes).
A opção do compilador TRUNC (OPT | STD | BIN) determina se e como o compilador corrige valores de volta à cláusula de imagem declarada e quantos dados significativos estão presentes ao acessar um item de dados.
Embora as considerações gerais de desempenho para dados BINÁRIOS e a opção TRUNC do COBOL 4 e versões anteriores ainda se apliquem no COBOL V6, algumas das diferenças relativas de desempenho para as várias subopções TRUNC foram alteradas (às vezes drasticamente). Essas mudanças podem afetar as opções de codificação e do compilador.
Para quantificar as diferenças de desempenho relativas e absolutas, uma série de operações de adição em itens de dados binários foi executada em um loop em uma máquina z15® Os 4 testes abaixo contêm o mesmo tipo e número de operações aritméticas, mas têm um número variável de dígitos. Todos os operandos são assinados. "
- TEST 1: 8 adições com um de cada 1 a 8 dígitos
- TEST 2: 8 adições cada com 9 dígitos
- TEST 3: 8 adições com um de 10 a 17 dígitos cada
- TEST 4: 8 adições cada com 18 dígitos
Os testes foram então compilados variando a opção TRUNC.
O primeiro experimento especificou a opção do compilador do TRUNC (STD).
O TRUNC (STD) instrui o compilador a sempre corrigir de volta para a cláusula PICTURE especificada e permite que o compilador assuma que os valores carregados tenham apenas o número especificado de dígitos da cláusula PICTURE.
| TRUNC (STD) | COBOL 4 contra TESTE 1 | COBOL 6 contra TESTE 1 | COBOL 6 contra 4 d COBOL |
|---|---|---|---|
| TEST 1: 1-8 dígitos | 100% | 100% | 17.2% |
| TEST 2: 9 dígitos | 153.1% | 99.7% | 11.2% |
| TEST 3: 10-17 dígitos | 484.5% | 153.5% | 5.4% |
| TEST 4: 18 dígitos | 759.6% | 99.7% | 2.3% |
- COBOL 6 supera o COBOL 4 em todos os comprimentos ao usar TRUNC(STD).
- Embora o desempenho diminua à medida que o número de dígitos aumenta tanto para COBOL 4 quanto para COBOL 6, ele diminui de forma muito mais gradual e para um valor geral muito menor usando COBOL 6 em comparação com COBOL 4.
O segundo experimento especificou a opção do compilador TRUNC (BIN). Especificar essa opção é equivalente a usar o tipo COMP-5 para todos os dados BINARY.
TRUNC (BIN) instrui o compilador a permitir que os valores sejam corrigidos apenas para a representação de dados subjacente (dois, quatro ou oito bytes) em vez de voltar para a cláusula PICTURE especificada. Essa opção também requer que o compilador assuma que os valores carregados podem ter até dois, quatro ou oito bytes de dados significativos.
| TRUNC (BIN) | COBOL 4 contra TESTE 1 | COBOL 6 contra TESTE 1 | COBOL 6 contra 4 d COBOL |
|---|---|---|---|
| TEST 1: 1-8 dígitos | 100% | 100% | 36.2% |
| TEST 2: 9 dígitos | 165.8% | 100% | 21.8% |
| TEST 3: 10-17 dígitos | 3889.4% | 2363.8% | 22.0% |
| TEST 4: 18 dígitos | 3889.2% | 2363.7% | 22.0% |
- COBOL 6 também supera o COBOL 4 em todos os comprimentos ao usar TRUNC(BIN).
- COBOL 6 não apresenta lentidão ao testar com 9 dígitos.
- Há uma redução drástica no desempenho tanto para COBOL 4 quanto para COBOL 6 (mas mais para COBOL 4 em termos absolutos) quando o comprimento é aumentado para além de 9 dígitos. Isso é devido ao requisito TRUNC (BIN) de que os dados de entrada podem conter até a palavra inteira de dados (e conversões de tipo de dados extra e rotinas de bibliotecas são necessárias).
- Corrigindo de volta para a cláusula PICTURE como com TRUNC (STD) ou
- Somente corrigindo de volta para o limite de dois, quatro ou oito bytes como com TRUNC (BIN)
| TRUNC (OPT) | COBOL 4 contra TESTE 1 | COBOL 6 contra TESTE 1 | COBOL 6 contra 4 d COBOL |
|---|---|---|---|
| TEST 1: 1-8 dígitos | 100% | 100% | 87.3% |
| TEST 2: 9 dígitos | 400.3% | 100.9% | 22.0% |
| TEST 3: 10-17 dígitos | 235.3% | 100.6% | 37.3% |
| TEST 4: 18 dígitos | 6099.0% | 156.9% | 2.3% |
- COBOL 6 também supera o COBOL 4 ao usar TRUNC(OPT).
- COBOL 6 não apresenta desaceleração até o caso de 18 dígitos, mas ainda assim supera amplamente o COBOL 4 neste comprimento mais longo.
- O uso de instruções de formulário 'G' de 64 bits permite um código muito mais eficiente para casos de> 8 dígitos
- Rotinas de biblioteca mais eficientes para os casos TRUNC (BIN) muito grandes
Priorizar sua inscrição para migração para V6 tem um exemplo específico de aritmética binária de palavra dupla (Aritmética Binária Grande) que demonstra a melhoria de desempenho para esse tipo de operação em relação ao COBOL 4 do compilador. Neste exemplo, o COBOL 6 é consideravelmente mais rápido do que o COBOL 4 e versões anteriores do compilador.
As diferenças relativas de desempenho entre as diferentes opções TRUNC foram suavizadas em comparação com o COBOL 4. Isso ocorre principalmente devido ao compilador inserir um teste de tempo de execução para estouro. Se nenhum estouro for possível, uma instrução de hardware 'divide' cara será evitada.
Se seus dados estiverem em conformidade com a cláusula PICTURE, TRUNC(OPT) continua sendo a melhor opção geral, mas, relativamente falando, ela apresenta menos melhorias em relação ao TRUNC(STD) do que em COBOL 4, e o desempenho absoluto geral é melhor com qualquer uma das opções em COBOL 6.
Embora TRUNC (BIN) permita um código mais eficiente ao armazenar um resultado COMPUTE ou MOVE, ele continua a prejudicar significativamente o desempenho quando esses itens de dados são usados como entrada para instruções aritméticas (como o compilador deve assumir o tamanho máximo de 2,4,8 bytes). COBOL 6 otimiza o código de correção para TRUNC(STD), de modo que o benefício de desempenho do TRUNC(BIN) foi ligeiramente reduzido.
Pode ser melhor especificar apenas COMP-5 para selecionar itens de dados versus usar TRUNC (BIN). Por exemplo, o desempenho geralmente será melhorado se os itens de dados em instruções COMPUTE em particular não forem especificados com COMP-5.