4D v16.3

Consejos de optimización

Inicio

 
4D v16.3
Consejos de optimización

Consejos de optimización  


 

 

Es difícil establecer un método definitivo para “programar bien”, pero queremos hacer énfasis en las ventajas de estructurar bien los programas. La capacidad de programar estructuradamente en 4D puede ser de gran ayuda.

La compilación de una base bien estructurada puede obtener mejores resultados que en una base mal estructurada. Por ejemplo, si escribe un método genérico para manejar n métodos de objeto, obtendrá resultados de más calidad en modo interpretado y en compilado que en una situación donde n métodos de objeto componen n veces el mismo conjunto de instrucciones.

En otras palabras, la calidad de la programación tiene un impacto en la calidad del código compilado.
Con práctica, puede mejorar progresivamente su código 4D. El uso frecuente del compilador le da una retroalimentación correctiva que le permite alcanzar instintivamente la solución más eficiente.

Entre tanto, le podemos ofrecer algunos consejos y trucos para que ahorre tiempo realizando tareas simples y recurrentes.

Algunas técnicas de programación pueden hacer que su código no sea fácil de leer tanto para usted como para otra persona en el futuro. Por esta razón, le aconsejamos comentar detalladamente sus métodos. De hecho, mientras que los comentarios excesivos tienden a hacer lenta una base interpretada, no tienen ninguna influencia en el tiempo de ejecución de una base compilada.

Las directivas de compilación pueden ayudarle a acelerar su código considerablemente. Cuando declara variables con base en su uso, el compilador utiliza el tipo de datos con el mayor alcance posible para no penalizarlo. Por ejemplo, si no declara la variable definida por la instrucción: Var:= 5, el compilador le dará el tipo Real, incluso si se puede declarar como Entero.

Reales  

Por defecto, el compilador da el tipo Real a las variables numéricas no declaradas por directivas de compilación y si las Propiedades de la base no indican otra cosa. Los cálculos con Reales son más lentos que con Enteros largos. Si sabe que una variable numérica siempre será un entero, es conveniente declararla con las directivas de compilación C_LONGINT.

Por ejemplo, es una buena práctica declarar sus contadores de bucles como Enteros.

Algunas funciones estándar de 4D devuelven Enteros (ejemplo: Character code, Int...). Si usted asigna el resultado de una estas funciones a una variable no declarada de su base, el compilador le asigna el tipo Real en lugar del tipo Entero. Recuerde declarar estas variables con directivas de compilación siempre que esté seguro de que no se utilizarán en un contexto diferente.

Este es un ejemplo simple de una función que devuelve un valor aleatorio dentro de un rango dado:

 $0:=Mod(Random;($2-$1+1))+$1

Siempre devolverá un entero. Escrito de esta manera, el compilador le dará a $0 el tipo Real en lugar de Entero o Entero largo. Es mejor incluir una directiva de compilación en el método:

 C_LONGINT($0)
 $0:=Mod(Random;($2-$1+1))+$1El parámetro devuelto por el método ocupará menos espacio en memoria y será much.
 
 Este es otro ejemplo. Imagine que declara dos variables como Entero largo:
 
 C_LONGINT($var1;$var2)

y una tercera variable no declarada recibe la suma de las otras dos variables:$var3:=$var1+$var2.

El compilador declarará la tercera variable, $var3, como Real. Usted tendrá que declararla explícitamente como Entero largo si quiere que el resultado sea Entero largo.

Nota: sea cuidadoso con el modo de cálculo en 4D. En modo compilado, no es el tipo de la variable que recibe el cálculo el que determina el modo de cálculo, sino el tipo de los operandos.

• En el siguiente ejemplo, el cálculo se efectúa sobre enteros largos:

 C_REAL($var3)
 C_LONGINT($var1;$var2)
 $var1:=2147483647
 $var2:=1
 $var3:=$var1+$var2

$var3 es igual a –2147483648 tanto en modo compilado como interpretado.

  • Sin embargo, en este ejemplo:
 C_REAL($var3)
 C_LONGINT($var1)
 $var1:=2147483647
 $var3:=$var1+1

Por razones de optimización, el compilador considera el valor 1 como un entero. En modo compilado, $var3 es igual a –2147483648 porque el cálculo se efectúa sobre Enteros largos. En modo interpretado, $var3 es igual a 2147483648 porque el cálculo se efectúa sobre Reales.

Los botones son un caso específico de Real que puede declararse como Entero largo.

Si quiere probar el valor de un carácter, es más rápido hacer la comparación con su valor Character code en vez de con el carácter mismo. La rutina estándar de comparación de caracteres tiene en cuenta todas las variaciones del carácter, tales como las acentuaciones.

El procesamiento de arrays de dos dimensiones se maneja mucho mejor si la segunda dimensión es más larga que la primera.

Por ejemplo, un array declarado como:ARRAY INTEGER(Array;5;1000)

será manejado mejor que un array declarado como:

 ARRAY INTEGER(Array;1000;5)
Campos  

Cuando necesite efectuar varios cálculos sobre un campo, puede mejorar el desempeño almacenando el valor del campo en una variable y realizando sus cálculos sobre la variable en lugar de sobre el campo. Considere el siguiente método:

 Case of
    :([Cliente]Dest="Nueva York")
       Transporte:="Mensajero"
    :([Cliente]Dest="Puerto Rico")
       Transporte:="Correo aéreo"
    :([Cliente]Dest="Exterior")
       Transporte:="Servicio de correo expreso"
    Else
       Transporte:="Servicio de correo regular"
 End case

Este método tomará más tiempo en ejecutarse que si se escribe de esta forma:

 $Dest:=[Cliente]Dest
 Case of
    :($Dest="Nueva York")
       Transporte:="Mensajero"
    :($Dest="Puerto Rico")
       Transporte:="Correo aéreo"
    :($Dest="Exterior")
       Transporte:="Servicio de correo expreso"
    Else
       Transporte:="Servicio de correo regular"
 End case

Como en el caso de los campos, es más rápido trabajar con variables que con punteros sin referencia. Cuando necesite realizar varios cálculos sobre una variable referenciada por un puntero, puede ahorrar tiempo almacenando el puntero sin referencia en una variable.

Por ejemplo, suponga que utiliza un puntero, MiPtr, para hacer referencia a un campo o a una variable. Usted quiere realizar un conjunto de pruebas sobre el valor referenciado por MiPtr. Puede escribir:

 Case of
    :(MiPtr->=1)
       Secuencia 1
    :(MiPtr->=2)
       Secuencia 2
 
 End case

El conjunto de pruebas se realizaría más rápido si se escribiera:

 Temp:=MiPtr->
 Case of
    :(Temp=1)
       Secuencia 1
    :(Temp=2)
       Secuencia 2
 
 End case

Utilice variables locales, siempre que sea posible, para estructurar su código. Utilizar variables locales tiene las siguientes ventajas:

  • Las variables locales ocupan menos espacio cuando se utilizan en una base. Se crean cuando se entra en el método donde se utilizan y se destruyen cuando el método termina su ejecución.
  • El código generado se optimiza para variables locales, especialmente para las de tipo Entero largo. Esto es útil para contadores en bucles.



Ver también 

Detalles de sintaxis
Guía de declaración
Mensajes de error
Utilización de directivas de compilación

 
PROPIEDADES 

Producto: 4D
Tema: Compilador

 
HISTORIA 

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v16)
Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)