Para cualquier optimización en Fox, piensen en como funciona.
Fuente -> FXP (precompilado) -> Runtime.
Ejemplo:
USE unaTabla IN 0 && Abro en alguna parte
SELECT unaTabla
SET ORDER TO TAG unIndice && establezco un orden
...
lcTablaAntes = ALIAS() && aca llegue de otra area, quiere recuperar después
SELECT unaTabla
lcOrdenAntes = ORDER(unaTabla) && luego de acceder quiero el orden anterior
SET ORDER TO TAG otroIndice && establezco nuevo indice
SEEK loQueBusques && uso comando SEEK y
IF FOUND() && ... luego el FOUND
* lo encontraste
ELSE
* no lo encontraste
ENDIF
SET ORDER TO (lcOrdenAntes) && dejo una tabla con el indice anterior
SELECT (lcTablaAntes) && vuelvo al área anterior
todo eso tiene que traducirse a llamadas a funciones C (C++) del runtime, una a una.
Entonces, la optimización de código pasa por reducir la cantidad de líneas de código y por ende, menor cantidad de llamadas en el runtime
USE unaTabla IN 0
* SELECT unaTabla && La tabla la selecciono solo en última instancia
* SET ORDER TO TAG unIndice && no fijo orden, para reducir por lo que indico mas adelante
...
IF SEEK(loQueBusques, "unaTabla", "otroIndice") && fijense cuantas instruccione elimine
* lo encontraste
ELSE
* no lo encontraste
ENDIF
* SET ORDER TO (lcOrdenAntes) tampoco necesito restaurar nada.
* SELECT (lcTablaAntes)
O sea, menor cantidad de instrucciones, más velocidad, de ejecución, de escritura, menor probabilidad de errores de codigo.
Menor acoplamiento entre metodos.
Y con el entorno de datos, pasa que las llamadas de apertura no las codificas, por eso son más rápidas.
Justo entro el mensaje de Fernando, lo que me ahorra tipear algunas cosas.
Y como comenta Fer, si usas capas, sos más rápido (Superman ;-D), cuando menos código +mejor.
Y si no repetis código, más rápido se carga el programa, menor probabilidad de swap de memoria, más espacio para buffers, todo es más rápido.
Por eso en otro post se hablaba de las ventajas del INSERT INTO en reemplazo del APPEND BLANK + REPLACE.
Piensen como glotones, quieren todo más rápido. Porque es mejor u Chopp que una botella para la cerveza, porque el Chopp no tiene cuello de botella.
Si quieres un sistema rápido, piensa en cual es el cuello de botella.
El mayor cuello de botella, es el Usuario. Entonces, debes buscar hacer que el usuario no frene el sistema (Código de Barras).
Luego viene la Red, la red es una caja negra salvo que seas un experto en redes, y como aceleras la red?
Tablas o datos que se modifican casi nada (codigos postales) replicalas (clonalas) y hacelas locales.
Los archivos temporales no se comparten, configura para que sean locales.
Abrir y cerrar tablas a cada rato, pone lenta la cosa, pero, reduce la probabilidad de corrupción de datos.
Y luego optimizas el código, haciendo que sean las menor cantidad de instrucciones posible (las que se ejecutan).
Todo lo que no se modifica dentro de un bucle, ponelo antes.
Evitar DO WHILE para recorrer tablas, mejor SCAN.
Si usan scan, no hace falta poner filtros.
Si hacen SCAN en tablas muy grandes siguiendo el orden de un indice,
primero una función SEEK() con SET NEAR ON
y luego SCAN REST
Y así muchas otras cosas.