Bienvenidos a Iseries Venezuela

Las mejores prácticas, recursos, tips, enlaces, videos y artículos para informáticos relacionados con el Iseries y el As/400 lenguajes de programación RPG, ILE RPG y SQL.

The best practices, resources, tips, links, videoes and articles for computer related to the Iseries and the As/400 languages of programming RPG, ILE RPG and SQL.

Monday, May 23, 2022

Mejores Prácticas para mejorar el performance -I-

                            


En este oportunidad, tres sencillos tips para mejorar el performance del programa Rpg

 

 

 

 

1.-Subrutinas versus Subprocedures.


El uso de Subprocedure ofrece las siguiente facilidades:

  • Uso de variables locales
  • Pase de parámetros
  • Puede ejecutarse como funciones (Built-in)
  • Puede ser exportado a otros programas.

Si no es necesario utilizar las facilidades que brinda el uso de subprocedures es preferible utlizar subrutinas. 

En general el EXSR se ejecuta más rapidamente que la invocación a un subprocedure.

 

 2.-El uso de SETLL en lugar de CHAIN.

  SETTL y %Equal responde más rapidamente que CHAIN.

Si solamente se  requiere determinar si un registro con cierta clave existe o no existe, es preferible utilizar el settl.

Algunos autores esgrimen que la diferencia es insignificante, sin embargo cuando se trabaja con millones o billones de registros puede ser significativo ahorrar tiempo tanto como sea posible.


3.-Registros Retenidos (Allocated)

Aunque este punto no es una mejora del performance de por sí, es conveniente prestar atención a esto para evitar fallas y retrasos a tiempo de ejecución.

Supongamos que tenemos un archivo declarado update y realizamos la siguiente operación:

        chain (clave1: clave2)  archivo;

        If campo1 = 'Y';

          campo2 = '001';

          update archivo;

       Endif;

 Esta secuencia de instrucciones aparentemente inofensivas puede dejar "allocated" un registro si la condición CAMPO1 = 'Y' no se cumple ya que no hay un ELSE que libere (unlock) el registro retenido con el chain.

      

 

        

     Si te pareció interesante, reenvíalo a un amigo haciendo click en el sobrecito que está al final del artículo o en el enlace de Linkedin que está encima de este mensaje.  El conocimiento es valioso, compártelo. 

    Autor: Ing. Liliana Suárez



Monday, April 25, 2022

Grupo de Activación. Segunda Entrega.

                             


Para quienes todavía no tienen claro qué es un "Grupo de Activación", lo explicaré con una analogía sencilla.

Cuando declaras una variable en un programa, el sistema reserva un espacio de memoria donde alojará los valores que sean asignados a esa variable durante el tiempo de ejecución del programa. El nombre de la variables es un nombre virtual, que nos permite a los desarrolladores manejar espacios de memoria en lenguajes de alto nivel.

 

Un Grupo de Activación se crea para “reservar” el espacio en memoria para programas que pueden ejecutarse de manera cooperativa, es decir que utilizan recursos comunes como archivos, directorios de enlaces, índices, módulos y otros, dentro de un mismo proceso. 

(Al final de este artículo, el enlace al artículo anterior para quienes deseen leerlo)

A partir de ahora trabajaremos con el grupo de activación Dftactgrp = *NO.

En forma análoga a los que hacemos al declarar variables, debemos:

1.-Elegir un nombre para el grupo de activación

2.-Definir el grupo de activación en algún lado...

En el ejemplo del cuadro a continuación coloqué el nombre: Master. Puede ser cualquier otro a gusto del programador.

 

¿Dónde Se Declaran Los Grupos de Activación?



Es muy importante nunca colocar QILE/QILETS como grupo de activación al crear programas de servicio (Crtsrvpgm) ni programas con modulos enlazados (Crtpgm). Los resultados pueden ser confusos o impredecibles.       

Con el comando DSPPGM podemos ver con cual grupo de activación se ha compilado un programa.         


¿Cuántos Tipos de Grupos de Activación Existen?

 

Monday, April 18, 2022

Grupos de Activación. Primera Entrega

                               

Este artículo es el primero de una serie dedicado a los Grupos de Activación. 

El tema es algo extenso cuando se explica en detalle y requiere tiempo para entender las implicaciones que puede tener a nivel práctico usar o no usar Grupos de activación.

Generalmente los desarrolladores en RPG no tenemos ni idea del impacto que tiene nuestro código en cuanto al nivel de performance: los tiempos de respuesta ni el consumo de recursos, de nuestros programas. El estudio de los grupos de activación y su funcionamiento nos ayuda a entender cómo podemos optimizar el uso de la memoria y de los recursos del equipo, para que los procesos se ejecuten de manera óptima.

Empecemos…

Un grupo de activación es un contenedor de recursos” dentro de un trabajo. El contenedor contiene un montón de activaciones, de ahí el término grupo de "activación". Una activación es una referencia a la asignación de almacenamiento y a las actividades de enlace de programas en tiempo de ejecución que realizan los sistemas operativos cuando se ejecuta un programa.  

Cuando compilamos un programa RPGILE por la opción 14 del strpdm, vemos una serie de parámetros entre los que se encuentra este:

Default activation group . .  Dftactgrp *YES              

Cuando este parámetro esta activado con *Yes, el programa RPG que se está compilando no puede utilizar procedures internos ni externos, programas de servicios ni directorios de enlace. El sistema entiende que se trata de un programa RPG tradicional.  El Grupo de activación por defecto es QILE.

Si queremos compilar un programa que admita enlaces, módulos, Procedimientos (procedures) y lo relacionado con ILE, entonces debemos colocar *NO. Lo más cómodo es colocar esta especificación en la Hoja ‘H’ para evitarnos el tener que acordarnos de colocarlo cada vez que debamos recompilar el programa.

En un RPG fon formato sería:  h DftActgrp(*no)

En un RPG Free format sería:  ctl-opt dftactgrp(*no);

Ambas declaraciones permiten al programa funcionar como un programa ILE

Cuando creamos un programa RPG que enlaza directorios y módulos con el comando CRTPGM

Podemos ver el siguiente parámetro:

Activation group . . . . . . . . ACTGRP         *ENTMOD     (módulo de entrada)

Esto significa que el grupo de activación que se tomará en cuenta para ejecutar el programa será el que sea establecido por el modulo “padre” o el “Entry Point” que inicia la ejecución de toda la serie de invocaciones a procedimientos (procedures) y programas de servicios y módulos de los códigos entre sí.

Si definimos que NO queremos un grupo de activación por defecto… ¿qué sucede?

 

Cuando colocamos *NO en la compilación por via Strpdm opción 14, al presionar enter, el sistema nos trae dos parametros por default

Default activation group . . . . DFTACTGRP    > *NO       

Activation group . . . . . . . . ….ACTGRP         *STGMDL   

Storage model  . . . . . . . . . ……STGMDL         *SNGLVL   

 

Para el parámetro Activation Group el valor *STGMDL indica que se va a seleccionar un modelo de memoria  pre-establecido  por el sistema.

Hay tres tipos de modelo de memoria. Estos tres tipos de modelos se especifican en el parámetro: Storage model y tiene tres valores posibles: