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.

Thursday, October 29, 2009

Mejores Prácticas de Programacion RPG












Aunque nos suministren miles de herramientas en el Iseries para desarrollar mejores programas, tendemos a arrastrar viejos hábitos que aprendimos en RPG II y RPG III. Con la incorporación de RPG4 y de Ile-Rpg es fundamental desarrollar códigos "limpios" que a su vez reduzcan tiempos de respuesta en los procesos.

A manera de ejemplo, supongamos que tenemos tres analistas en una competencia. El reto es optimizar el siguiente código en RPG III. Lo dejamos en esta versión de RPG porque muchas veces es utilizado como excusa el hecho de no tener experiencia en RPG4, Free RPG o IleRpg para generar un código engorroso y con un tiempo de ejecución innecesariamente alto.


En un ejercicio de imaginación supongamos los siguientes Costos:
- Cada IF cuesta: un segundo.
- Encender o apagar un indicador: 1 segundo
- Cada Z-add cuesta dos segundos:
son dos instrucciones en una: primero mover cero y luego sumar.
-Cada comparación: 1 segundo
-Llamar a la rutina: 1 segundo



El código original cuesta en tiempo SIEMPRE lo siguiente:
Cuerpo principal: 8 segundos
Rutina PROCES: 18 segundos
Total: 26


Código Original:

C................SETOF....................010203...3 segundos
C..CODTRA.IFEQ '01'...............................1 segundo
C................SETON....................01...........1 segundo
C................EXSR GENE.........................1 segundos
C................ENDIF
C*
C.CODTRA...IFEQ '02'..............................1 segundo
C................SETON.....................02..........1 segundo
C................EXSR GENE.........................1 segundos
C................ENDIF
C*
C.CODTRA...IFEQ '03'..............................1 segundo
C................SETON.....................03..........1 segundo
C................EXSR PROCES.......................1 segundo
C................ENDIF


...PROCES........BEGSR
.................INSTRUCCIONES PREVIAS....
................................
................................
01..............Z-ADD1.................STACA1..............3 segundos
02..............Z-ADD2................STACA1..............3 segundos
03..............Z-ADDDIDCOB....DIADE1.............3 segundos
03..............Z-ADDMEDCOB...MESDE1.............3 segundos
03..............Z-ADDA#DCOB....A#ODE1.............3 segundos
03..............Z-ADD3.................STACA1..............3 segundos
.................ENDSR

El primer analista propone lo siguiente:



C.................SETOF...........010203............3 segundos
C.................SELECT
C.CODTRA...WHENEQ.....'01'...........1 segundo
C.................SETON...........01............1 segundo
C.CODTRA...WHENEQ....'02'............1 segundo
C.................SETON..........02.............1 segundo
C.CODTRA...WHENEQ....'03'............1 segundo
C.................SETON..........03.............1 segundo
C.................ENDSL
C.................EXSR........PROCES.............1 segundo



A simple vista se detecta una mejora significativa. EL Select, permite saltar las comparaciones innecesarias. Si CODTRA tiene un valor de ´01´ el sistema no continua realizando comparaciones sino que enciende el indicador correspondiente y ejecuta la rutina PROCES. En el peor de los casos, suponiendo que todos los códigos CODTRA son ´03´ los tiempos de respuesta se igualan en esta parte del proceso, entre el código original y esta propuesta. Es decir ambas duran 8 segundos en el cuerpo principal del progtama.

Veamos que sucede en la rutina PROCES:
El analista propone declarar previamente dos estructuras de datos. Esto reduce la cantidad de MOVE. Ademas sustituye los Z-ADD por MOVE que consume menor tiempo de respuesta. En el peor de los casos el tiempo de ejecución de la rutina PROCES totaliza 5 segundos, suponiendo que siempre CODTRA vale ´03

Declarar dos DS en la hoja D o en la hoja I (depende si es RPG 3/RPG4)

IDS
..........FECHA....1 80
..........DIA.........1 20
..........MES........3 40
..........AÑO........5 80

IDS
..........FECDES....1 80
..........DIADES....1 20
..........MESDES....3 40
..........AÑODES....5 80

PROCES BEGSR

.............INSTRUCCIONES PREVIAS....
................................
................................

.............Select

............*IN01...WHENEQ...*ON.......1 segundo
...................MOVE....1......STACA1....1 segundo
............*IN02...WHENEQ...*ON.......1 segundo
...................MOVE....2......STACA1....1 segundo
............*IN03 WHENEQ.....*ON.............1 segundo
...................MOVE....FECHA....FECDES 1 segundo
..................MOVE....3........STACA1 1 segundo

..............EndSl

..............ENDSR


Resumiendo: esta primera propuesta cuesta en tiempo:
Cuerpo Principal: 8 segundos
Rutina PROCES: 5 segundos
Total 13


Propuesta del Analista 2

Este analista propone dejar el cuerpo principal igual que el primer analista pero
sugiere modificar PROCES como sigue:

.....1....DO.....3.....X.....20............1 segundo

........IF......*IN,X....*EQ....*ON.......1 segundo
........MOVE.....X.......STACA1.......1 segundo
........IF X..*EQ 3......................1 segundo
........MOVE FECHA FECDES......1 segundo
........ENDIF
........ENDIF


ENDDO

Quizas los *IN,X deslumbren de entrada porque pareciera que hacen la tarea
del programador en forma más automática. Sin embargo, si contamos los segundos
que consume cada iteración del lazo. Los tiempos consumidos igualan la propuesta
del segundo analista. Se ha cambiado la forma pero no se han mejorado los tiempos de respuesta entre una analista y el otro. Ambas propuestas producen el mismo resultado.


Propuesta del Analista 3


C........MOVE....CODTRA....CONTROL.....20....(1era Opción)...1 segundo
C
C........EXSR....PROCES.....1 segundo


Primera Opción: Si la rutina PROCES modifica en sus intrucciones previas el valor de CODTRA entonces se guarda su valor en la variable Numérica CONTROL. Tarda dos segundos el cuerpo del programa.

Segunda Opción: Si la rutina PROCES no modifica el valor de CODTRA se salta este paso del move y el cuerpo principal solo debe llamar a PROCES tarda solo 1 segundo.

Veamos que sucede en PROCES. Cabe destacar que, la variable CONTROL está sustituyendo lo que en el programa original era la variable numérica STACA.

PROCES BEGSR

INSTRUCCIONES PREVIAS....
................................
................................


CONTROL IFEQ 3 (1era Opción)
MOVE FECHA FECDES
ENDIF

CODTRA IFEQ 3 (2da Opción)
MOVE FECHA FECDES
ENDIF

ENDSR



La rutina Proces dura en ambas opciones dos segundos.

El mayor tiempo de ejecución sería de 4 segundos y el menor tiempo de 3 segundos.
Si comparamos 3-4 segundos con 26 segundos, hemos reducido el tiempo de respuesta a
por lo menos un 78% de su duración original. Ademas de generar un código mucho mas legible y fácil de mantener.

Introducir comentarios en el código y declarar constante con nombres significativos en la hoja D o en la hoja I según sea la versión RPG facilita la lectura del programa. Puede declararse por ejemplo una constante llamada DEBITO con el valor `01` otra constante llamada Credito con valor ´02´y una tercera llamada DEUDA con valor ´03´´. EN lugar de preguntar por el valor ´01´podriamos pregunta IF CODTRA = DEBITO. Haciendo mas fácil el mantenimiento del programa.

Si te pareció interesante, reenvialo a un amigo haciendo click en el sobrecito que está al final del artículo. El conocimiento es valioso, compártelo.


Autor: Ing. Liliana Suárez

No comments: