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.

Tabela 1. Resultados de diferenças de desempenho de quatro casos de teste ao especificar TRUNC (STD)
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%
Esses resultados demonstram que:
  • 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.

Tabela 2.. Resultados de diferenças de desempenho de quatro casos de teste ao especificar TRUNC (BIN)
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%
Esses resultados demonstram que:
  • 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).
O terceiro e último experimento especificou a opção do compilador TRUNC (OPT). TRUNC (OPT) é uma opção de desempenho. O compilador assume que os dados de entrada estão em conformidade com a cláusula PICTURE e, em seguida, permite ao compilador a liberdade de manipular dados de uma das seguintes maneiras que são mais ideais:
  • 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)
Tabela 3.. Resultados de diferenças de desempenho de quatro casos de teste ao especificar TRUNC (OPT)
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%
Esses resultados demonstram que:
  • 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.
Nota: Use o TRUNC (OPT) somente se você tiver certeza de que os dados que estão sendo movidos nas áreas binárias estão em conformidade com a cláusula PICTURE, caso contrário, poderão ocorrer resultados imprevisíveis Consulte TRUNC no Enterprise COBOL for z/OS® Guia de programação para obter mais informações.
Em todas as opções TRUNC e comprimentos de itens de dados apresentados acima, COBOL 6 supera COBOL 4. Estas melhorias devem-se às seguintes razões:
  • 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.