Complementando lo que indica Fernando.
Como acelerar Fox.
Reducir al máximo la cantidad de comandos utilizados por una operación.
A los ejemplos que dio Fernando, se puede aplicar con el reemplazo de
SEEK, luego IF FOUND() con IF SEEK()
Tratar de no cambiar de área para acceder a tablas (cambios mínimos, p.e. p/SCAN)
Tratar de no activar índices (SEEK permite indicar una tabla diferente a la actual, ninguna sentencia de SQL necesita indicar indice a utilizar, es más un indice activo perjudica casi siempre el desempeño).
Si se accede a más de una tabla a la vez en un comando, RUSHMORE solo trabaja con SQL. (SELECT, UPDATE, etc.)
Minimizar la cantidad de indices definidos para gestionar la tabla, sobre todo si se está modificando. En VFP, los autoincrementales son notoriamente lentos.
Si se necesita acceder repetidamente a contenidos de tablas pequeñas, conviene levantar las a un arreglo (los cursores en general crean archivos temporarios por lo que casi siempre van a parar al disco) y usar ascan() sobre los arreglos
Lo que se debe tratar siempre es minimizar las operaciones en disco, sobre todo si son remotos.
Usar expresiones de nombre en lugar de macrosustitución, en realidad, usar macrosustitución si realmente no hay otra forma.
Luego las generales de programación.
En una sentencia IF compuesta, si las condiciones se relacionan con AND, poner primero la condición que menos se cumple, como la evaluación se corta no bien el IF se define, al no cumplirse la primera, ya no evalua el resto (una que no se cumple, ya no se cumple el if).
Caso contrario es si las condiciones se relacionan con OR, primero se pone la que más se cumple (con una que se cumpla el if se cumple y no pregunta por las otras)
Esta lógica de los IF también aplica a cualquier lugar donde se hagan evaluaciones lógicas (WHERE, WHILE, FOR <- que no sea bucle).
Si tienes un DO CASE, funciona como las OR, entonces los primeros CASE van con las que más se cumplan.
Con bucles, todo calculo que no se modifica dentro de un bucle, debe ponerse adelante del bucle.
La clausula WITH thisalgo ENDWITH acelera las operaciones dentro (ojo, un return desde dentro de un WITH puede producir "planches" del programa aleatoriamente").
En general: Lo mas lento en una aplicación es la interfaz con el usuario, la "barras de progreso", suelen consumir más tiempo que el proceso de datos del cual pretender mostrar el avance (mejor, crear un gif animado que muestre que se está procesando).
Luego sigue en lentitud el acceso a través de la red (configurar archivos locales). En caso de tablas pequeñas, relativamente estables (no se modifican), conviene tenerlas en el disco local (ya sea por copia o por crear un cursor al inicio).
Luego el cuello de botella son las operaciones con disco. Reducir la cantidad de indices, el tamaño de los campos e indices es un tema mucho mas largo que todo lo desarrollado hasta aquí.
Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza los acompañe