Uso correcto de los tipos de datos
El
uso de la memoria y el procesamiento van a depender de los tipos de datos que
utilicemos en nuestros programas y de las opciones con que estos datos son
compilados.
A
continuación detallamos que tipos de datos en COBOL son más eficientes y como
influyen en ello diferentes opciones de compilación.
BINARY (COMP o COMP-4)
Las
consideraciones generales de eficiencia cuando utilizamos la declaración PICTURE S9(n) COMP son:
OPCION
|
N
|
Eficiencia
|
TRUNC(STD)
|
1-8
|
La
más rápida
|
9-10
|
Un
10 % más lenta que de 1-8
|
|
10-17
|
Un
230 % más lenta que de 1-8
|
|
18
|
Un
450% más lenta que de 1-8
|
|
TRUNC(OPT)
|
1-8
|
Es
la más rápida
|
9-10
|
Un
40 % más lenta que de 1-8
|
|
10-17
|
Un
25 % más lenta que de 1-8
|
|
18
|
Un
115 % más lenta que de 1-8
|
|
TRUNC(BIN)
|
1-4
|
La
más rápida
|
5-9
|
Un
45 % más lenta que de 1-4
|
|
10-18
|
Un
3015 % más lenta que de 1-4
|
COMP-5
Los
datos binarios de tipo COMP-5 son similares a los anteriores BINARY o COMP-4
con la excepción de que siempre se comportan como si la opción TRUNC(BIN) estuviera seleccionada para
ellos.
OPCION
|
N
|
Eficiencia
|
TRUNC(STD)
TRUNC(OPT)
TRUNC(BIN)
|
1-4
|
La
más rápida
|
5-9
|
Un
30 % más lenta que de 1-4
|
|
10-18
|
Un
3020 % más lenta que de 1-4
|
Conversiones de datos
Las
conversiones entre diferentes formatos de datos a un formato común son
necesarias cuando se realizan cálculos con diferentes tipos de datos. Esto
implica tiempo adicional de procesamiento y almacenamiento para estas
conversiones.
DISPLAY
Evite
utilizar los datos con USAGE DISPLAY para realizar cálculos, especialmente en
áreas donde tengan un uso intensivo. Los datos con USAGE DISPLAY obligan a
realizar operaciones de conversión antes y después de utilizar el tipo de dato.
Esto implica una llamada a una rutina interna de la librería de COBOL que
podíamos ahorrárnosla si utilizamos el dato apropiado que no requiera
conversión.
OPCION
|
N
|
Eficiencia
|
ARITH(COMPACT)
|
1-15
|
La
más rápida con un número par de dígitos
|
2-16
|
Un
20 % más lenta con un número impar de dígitos que el caso anterior
|
|
17-18
|
Un
70-90 % más lenta que de 1-15 dígitos con un número par de dígitos
|
|
TRUNC(EXTEND)
|
1-15
ó de 19-31
|
La
más rápida con un número par de dígitos
|
2-16
ó
20-30
|
Un
20 % más lenta usando un número impar de dígitos que en el caso anterior
|
|
17-18
|
Es
un 70-90% más lenta con un número par de dígitos que el caso anterior
|
PACKED-DECIMAL (COMP-3)
Cuando
se utilicen datos de tipo COMP-3 en cálculos hay que intentar utilizar entre
1-15 dígitos. Números con más de 15 dígitos implican que las operaciones de
multiplicación o división necesitan llamar a una rutina extra que influye en la
velocidad en que se realizan los cálculos.
Adicionalmente
se tiene un resultado mucho más eficiente con datos COMP-3 con signo y un
número par de dígitos.
OPCION
|
N
|
Eficiencia
|
ARITH(COMPACT)
|
1-15
|
La
más rápida con un número par de dígitos (10-30% más rápida con que un número
impar de dígitos)
|
16-18
|
Un
150 % más lenta que el caso anterior
|
|
TRUNC(EXTEND)
|
1-15
|
La
más rápida con un número par de dígitos (5-30% más rápida con que un número
impar de dígitos)
|
16-31
|
Un
150 % más lenta que el caso anterior
|
Selección de los tipos de datos apropiados
Cuando
se seleccionan los tipos de datos, no solo hay que tener en cuenta el tipo
lógico (de caracteres, numéricos, etc.) para el dato que van a acomodar, sino
también el tamaño del dato y las consideraciones de eficiencia.
Los
dos primeros aspectos dependen más de la habilidad del programador y de la
naturaleza del requerimiento que se está programando.
No
obstante, tiene siempre que primar el criterio de eficiencia. Si vamos a
guardar un nombre de usuario de 8 caracteres no hace falta un PIC X(50) sino un PIC X(8).
En
ocasiones, los programadores dedican más espacio ante la imposibilidad de
preveer el futuro crecimiento de un dato. Por ejemplo si un dato es el nombre o
apellidos de un usuario, es muy difícil preveer entre nombres cortos o largos o
compuestos, como Iván o José Manuel (en un caso nos bastarían 4 caracteres y en
otro 11). Lo más lógico es encontrar un tamaño razonable como un PIC X(25) que podría acomodar la
mayoría de los nombres y apellidos compuestos en español.
Decimal
empaquetado (COMP-3) vs. binario (COMP o COMP-4) con TRUNC(STD)
|
|
1-9
dígitos
|
COMP-3
es 40-80% más lento
|
10-17
dígitos
|
COMP-3
es 10-50% más rápido
|
18
dígitos
|
COMP-3
es un 70% más rápido
|
Decimal
empaquetado (COMP-3) vs. binario (COMP o COMP-4) con TRUNC(OPT)
|
|
1-8
dígitos
|
COMP-3
es 200-450% más lento
|
9
dígitos
|
COMP-3
es 100% más lento
|
10-17
dígitos
|
COMP-3
es 200-500% más lento
|
18
dígitos
|
COMP-3
es un 40% más rápido
|
Decimal
empaquetado (COMP-3) vs. binario (COMP o COMP-4) con TRUNC(BIN) o COMP-5
|
|
1-8
dígitos
|
COMP-3
es 200-400% más lento
|
9
dígitos
|
COMP-3
es 85% más lento
|
10-18
dígitos
|
COMP-3
es un 70-86% más rápido
|
DISPLAY vs.
Decimal empaquetado (COMP-3)
|
|
1-6
dígitos
|
DISPLAY
es un 50% más lento
|
7-16
dígitos
|
DISPLAY
es un 40% más lento
|
17-18
|
DISPLAY
es 100% más lento
|
DISPLAY vs. binarios
(COMP o COMP-4) con TRUNC(STD)
|
|
1-8
dígitos
|
DISPLAY
es un 50%-80% más lento
|
9
dígitos
|
DISPLAY
es un 40% más lento
|
10-16
dígitos
|
DISPLAY
es 30-50% más rápido
|
17
dígitos
|
DISPLAY
es un 10% más rápido
|
18
dígitos
|
DISPLAY
es un 40% más rápido
|
DISPLAY vs. binarios
(COMP o COMP-4) con TRUNC(OPT)
|
|
1-8
dígitos
|
DISPLAY
es un 200%-400% más lento
|
9
dígitos
|
DISPLAY
es un 150% más lento
|
10-16
dígitos
|
DISPLAY
es 200-400% más lento
|
17
dígitos
|
DISPLAY
es 500% más lento
|
18
dígitos
|
DISPLAY
es un 40% más rápido
|
DISPLAY vs. binarios
(COMP o COMP-4) con TRUNC(BIN) o COMP-5
|
|
1-4
dígitos
|
DISPLAY
es un 200%-400% más lento
|
5-9
dígitos
|
DISPLAY
es un 200-250% más lento
|
10-18
dígitos
|
DISPLAY
es 70-85% más rápido
|
Aritmética de punto fijo contra punto flotante
Cuando
se trata de mejorar el rendimiento de una aplicación, hay que determinar
cuidadosamente cuando utilizamos aritmética de punto fijo y de punto flotante.
Cuando
hacen falta conversiones, los datos de tipo decimales empaquetados (COMP-3) o
binarios con 9 dígitos o menos, generan una sobrecarga cuando son convertidos a
o desde datos de punto flotante (COMP-1 o COMP-2).
Además
cuando se utilizan exponentes muy grandes, la operación es más eficiente si es
forzada completamente a punto flotante:
01 A PIC S9(6)V9(12)
COMP-3 VALUE 0.
01 B PIC
S9V9(12) COMP-3 VALUE 1.234567891.
01 C PIC S9(10) COMP-3 VALUE -99999.
COMPUTE
A = (1 + B) ** C. (original)
COMPUTE
A = (1.0E0 + B) ** C.(forzada)
En
este ejemplo hemos forzado el cálculo a punto flotante mediante el cambio de la
constante en punto fijo 1 a la constante en punto flotante 1.0E0.
Como
consideración de rendimiento, una operación de exponenciación es un 98% más
rápida en punto flotante que en punto fijo.
Índices de tablas
El
uso de índices para direccionar a una tabla, es mucho más eficiente que
utilizar otro tipo de variable. Esto se debe a que los índices ya contienen el
desplazamiento en la memoria calculado desde el comienzo de la tabla y no este
no tiene que ser vuelto a calcular en tiempo de ejecución.
Los
índices de tabla son definidos por la cláusula INDEXED BY en la cláusula OCCURS
para un tipo de dato.
El
uso de otras variables implica que
primero hay que convertir su valor en un desplazamiento para luego poder
acceder a los datos de la tabla.
Si
es necesario utilizar variables diferentes a los índices para acceder a una
tabla, utilice datos de tipo binario con signo (COMP) con 8 ó menos dígitos.
Esto permitirá el uso de aritmética entera fullword durante los cálculos y en
algunos casos el uso de 4 dígitos o menos generará aritmética halfword aún más
rápida.
Las
consideraciones de rendimiento en este caso con un PIC S9(8) son:
- El
uso de datos binarios (COMP) para direccionar una tabla es un 40% más
lento que los índices
- El
uso de decimales empaquetados (COMP-3) para direccionar una tabla es un
220% más lento que los índices
- El
uso de datos con USAGE DISPLAY es un 300% más lento que el uso de índices
OCCURS DEPENDING ON
En COBOL podemos tener tablas de longitud
variable cuyo tamaño es calculado en tiempo de ejecución a partir del valor de
una variable.
01 MES
01 SEMANA. 02 VISTAS |
PIC 99.
PIC 9(4) OCCURS 28 TO 31 DEPENDING OF MES. |
Lo
más óptimo sería:
01 MES
01 SEMANA. 02 VISTAS |
PIC 99 COMP.
PIC 9(4) COMP OCCURS 28 TO 31
DEPENDING OF MES.
|
De esta manera nos evitamos conversiones
extras cada vez que se haga referencia a la longitud de la tabla o sus
elementos.
De
manera general:
- El
uso de tablas de longitud variable es un 5% más lento que las tablas de
longitud fija
- Cuando
se usan tablas de longitud variable la referencia al primer elemento
complejo es un 9% más lenta que en tablas de longitud fija
- Cuando
se usan tablas de longitud variable la referencia a cualquier elemento
complejo diferente del primer elemento es un 150% más lenta que en tablas
de longitud fija
Variables de control de bucles
Cuando
se utiliza la sentencia PERFORM VARYING, si utilizamos una variable de control
tipo DISPLAY, la misma tiene que ser convertida a un tipo de datos COMP antes
de ser evaluada provocando una demora que puede ser significativa cuando
tenemos miles o millones de datos o incluso varios bucles anidados.
Las
consideraciones de rendimiento para variables de control de bucles tipo PIC S9(8) son:
- El
uso de COMP-3 es un 250% que el uso de COMP
- El
uso de DISPLAY es un 400% que el uso de COMP
Búsquedas
Cuando
se utiliza la instrucción SEARCH, hay que poner los datos usados con más
frecuencia en las primeras posiciones de la tabla para optimizar las búsquedas
secuenciales.
Para
obtener mejores rendimientos, especialmente en tablas muy grandes conviene que
los datos están previamente ordenados y se utilice la sentencia SEARCH ALL
(búsqueda binaria).
Las
consideraciones generales de rendimiento son:
- Usar
la búsqueda binaria (SEARCH ALL) para tablas de 100 elementos, es un 15%
más rápido que la búsqueda secuencial (SEARCH)
- Usar
la búsqueda binaria (SEARCH ALL) para tablas de 1000 elementos, es un 500%
más rápido que la búsqueda secuencial (SEARCH)
- El
tamaño de la tabla afecta directamente el rendimiento de la búsqueda. Las
búsquedas en tablas muy grandes se hacen mejores de forma binaria
Conversión de caracteres
Cuando
se convierte a mayúsculas o minúsculas un conjunto de caracteres, es
generalmente más eficiente el uso de INSPECT CONVERTING que el uso de las
funciones predefinidas FUNCTION UPPER-CASE o FUNCTION LOWER-CASE.
Adicionalmente
estas funciones usan almacenamiento temporal en la pila, que la sentencia
INSPECT no utiliza. Esta cantidad extra depende del tamaño de la cadena o dato
de caracteres a convertir.
Las
consideraciones de rendimiento son:
- En
una prueba en la que se realizaron 1000 conversiones a mayúsculas, fue un
35% más eficiente el uso de INSPECT CONVERTING que el uso de FUNCTION
UPPER-CASE.
- En
esta misma prueba, se utilizó un 70% más de memoria que el uso de INSPECT
CONVERTING
Inicializando datos
La
sentencia INITIALIZE inicializa conjunto de datos a sus valores
predeterminados. Su funcionalidad es equivalente al uso de uno o más sentencias
MOVE.
Sin
embargo es ineficiente inicializar toda una estructura de datos, a menos que
todos sus miembros necesiten tener su valor predeterminado.
Si
en la estructura de datos hay una cláusula OCCURS es más eficiente utilizar
MOVE si queremos inicializar todos los miembros del conjunto a un mismo
carácter (por ejemplo espacio o X’00).
Las
consideraciones de rendimiento para un programa que tiene cinco OCCURS en un
grupo son:
- Cuando
cada OCCURS en el grupo tenía 100 elementos, un MOVE al grupo fue un 8 %
más rápido que un INITIALIZE al grupo
- Cuando
cada OCCURS en el grupo tenía 1000 elementos, un MOVE al grupo fue un 23 %
más rápido que un INITIALIZE al grupo
0 comentarios:
Publicar un comentario