Initialize

Todo lo relacionado con Cobol en ambientes batch, online(CICS,IMS) con bases de datos(DB2, Adabas) etc.
Responder
jamcogar
Usuario
Usuario
Mensajes: 17
Registrado: 18 Feb 2009, 11:55
País: españa
Ciudad: madrid
Ocupación: Analista de desarrollo

Initialize

Mensaje por jamcogar » 09 Feb 2015, 14:55

Hola:
En el proyecto que estoy, se están realizando optimizaciones a diferentes rutinas que consumen mucho CPU y se me ha presentado el siguiente caso:
- Hay una rutina principal que invoca a varias rutinas, cuyas estructuras son arreglos con occurs.
Actualmente en la rutina principal en el párrafo de inicio se están inicializando todas las estructuras de entrada y salida de las rutinas que son invocadas, y dado que la lógica del proceso tiene una instrucción condicional por el cual sólo se invoca a una de las rutinas dependiendo de la condición es que se está considerando realizar la inicialización de una rutina sólo en el párrafo que la invoque y de esta manera no estar inicializándolas todas, en ese punto me surge una duda:
Si tengo el caso de que Rutina1 invoque a Rutina2 y Rutina2 tiene una copy de salida con un occurs de 100:

CALL RUTINA2 USING ADE-RUTINA2
ADS-RUTINA2

Donde ADS-RUTINA2 es:
05 RUTINA2O.
10 NUM-REG-PGN-SN PIC 9(9).
10 CTD-ETC-PLL-IN PIC X(1).
10 IND-PGN-IN PIC X(1).
10 CLT-GEN-SDO-GR
OCCURS 50 TIMES.
15 CLT-CLV-SDO-GR.
20 CLT-DET-SDO-GR.
25 COD-CLI-CD PIC S9(9)
25 COD-CTA-CD PIC S9(9)

entonces que sería mejor:
- ¿ Hacer la inicialización a la copy de salida, inicializando la variable RUTINA2O ?
- Inicializar sólo la primera ocurrencia de la copy de salida, de ser éste el caso ¿Cómo se realizaría?

Muchas gracias por lo que puedan aportarme.

wicherc
Usuario
Usuario
Mensajes: 1
Registrado: 24 Jun 2013, 11:16
País: Argentina
Ciudad: Buenos Aires
Ocupación: Analista de produción

Re: Initialize

Mensaje por wicherc » 18 Feb 2015, 08:57

Estimado: Según mi propia experiencia, la sentencia INITIALIZE es muy cómoda pero cuesta mucho. En código de máquina, esta sentencia se traduce en otras tres, por lo que recomiendo que se utilice sólo lo necesario.
Se pueden hacer varias cosas para subsanarlo. La primera sería reemplazar esa sentencia por sendos MOVE. Es más largo para programar, pero consume muchísimo menos.
Tal como está la explicación aportada de tu código fuente, va a resultar más económico escribir:

MOVE ZEROES TO CLT-GEN-SDO-GR.

Por otra parte, algo más económico aún es inicializar una variable igual a RUTINA2O dentro de los procedimientos iniciales, es decir, lo haces por única vez.

INITIALIZE WK-COPIA-RUTINA2O.

Luego, por cada vez que necesites inicializar la verdadera RUTINA2O, antes de la invocación a cada RUTINA2, puedes hacer:

MOVE WK-COPIA-RUTINA2O TO RUTINA2O.

Espero te sea de utilidad.

Responder