A continuación encontrarás traducido al Castellano el artículo escrito por Gabriel Ludosanu y publicado originalmente en el Blog oficial de Xojo.
El rendimiento es una de las principales cuestiones para cualquier aplicación, especialmente cuando los usuarios esperan interacciones sin interrupciones y resultados rápidos. Afortunadamente Xojo proporciona tanto las herramientas como las técnicas que te permitirán garantizar que tus apps funcionen de la forma más eficaz posible.
Sin embargo, no es conveniente comenzar con la optimización en el ciclo inicial de la implementación, sino cuando la app o nueva característica añadida ya esté implementada y funcionando sin bugs. Es entonces, e incluso en la siguiente iteración del producto, cuando debemos de ocuparnos por optimizar su rendimiento. Ya se sabe: “La optimización temprana es la raíz de todos los males”.
A continuación te mostramos los cinco consejos que deberías de tener en cuenta a la hora de refinar tus aplicaciones Xojo.
1 Identifica los cuellos de botella con el Perfilador de Código
Antes de realizar cualquier optimización, necesitas determinar en qué partes está invirtiendo más tiempo tu aplicación. El Perfilador de código incorporado en el IDE (Profiler) proporciona información detallada sobre el tiempo de ejecución de cada método, ayudándote así a identificar los puntos más conflictivos.
- Activa el Perfilador: en la opción Build Settings de tu proyecto, asegúrate de que la característica “Profiling” esté activa. Luego ejecuta tu aplicación en modo de depuración.
- Analizar los resultados: tras salir de la ejecución de la aplicación depurada, revisa el informe del perfilador de código para ver qué métodos y líneas de código están consumiendo más tiempo.
- Céntrate en las áreas de mayor impacto: echa un vistazo primero a los mayores consumos de tiempo. Por ejemplo, una pequeña corrección u optimización en una función que se ejecuta múltiples veces puede derivar en una ganancia de rendimiento significativa.
Consejo Pro: limita los cambios a una área en cada ocasión y vuelve a ejecutar el perfilador. Este enfoque te permitirá confirmar si las optimizaciones realizadas tienen un impacto real. Lee más sobre la característica Perfilador de código en la documentación de Xojo.
2 Utiliza estructuras de datos y algoritmos eficientes
Elegir de forma correcta las estructuras de datos pueden mejorar de forma notable el rendimiento, especialmente en aquellas aplicaciones que realicen un uso intensivo de datos.
- Arrays vs. Diccionarios: en el caso de grandes conjuntos de datos sobre los que se apliquen búsquedas constantes un diccionario proporciona resultados más rápidos en comparación con un array, especialmente cuando se está buscando una clave determinada.
- Evita el acceso repetitivo a propiedades: si accedes al valor de una misma propiedad de clase o control dentro de un bucle, almacena dicho valor en primer lugar sobre una variable local. Esto minimiza el tiempo de acceso en cada una de las iteraciones del bucle.
- Complejidad en los Algoritmos: revisa los algoritmos encargados de realizar tareas de gran calado. Los bucles anidados que pueden parecer simples pueden ser realmente lentos cuando se aplican sobre grandes conjuntos de datos. En lo posible, sustitúyelos con métodos de búsqueda y ordenación más eficientes.
Ejemplo
En vez de utilizar de forma repetida myArray.IndexOf(item) dentro de un bucle, almacena el índice en una variable o cambia a un diccionario para que la búsqueda sea más rápida.
3 Descarga el trabajo duro mediante el uso de Hilos
Hacer que tu aplicación sea responsiva suele implicar, con frecuencia, la ejecución de las tareas más pesadas en segundo plano.
- Por qué los Hilos son útiles: Los Hilos de Xojo te permiten realizar cálculos complejos y que requieran tiempo sin que la interfaz de usuario se quede bloqueada. Esto proporciona una mejor experiencia de usuario y permite que los usuarios continúen usando la app al tiempo que se estén procesando los datos.
- Identificar buenos candidatos: cualquier procesado de datos, transferencias de red o cualquier tarea que pueda tomar más de una fracción de segundo serán buenos candidatos a la hora de beneficiarse en el uso de hilos.
Consejo Pro: si sólo tienes un retardo breve (como pueda ser la lectura de un archivo pequeño) entonces el uso de los hilos puede introducir una complejidad adicional no necesaria. Céntrate en el uso de hilos para aquellas tareas que ciertamente se beneficien de la ejecución en paralelo o la ejecución asíncrona.
4 Gestiona la E/S con archivos y Red de forma eficiente
El acceso a disco y las peticiones de red tienden a ser algunos de los cuellos de botella más comunes.
- Operaciones en lotes: en vez de leer o escribir los datos una línea cada vez en un bucle, procura a realizar las lecturas/escrituras en lotes para minimizar la sobrecarga que conlleva.
- Aplica caché de forma estratégica: si tu app carga los mismos datos de forma frecuente (como pueda ser archivos de configuración), entonces almacénalos en memoria para obtener un acceso más rápido.
- Llamadas asíncronas: en el caso de aquellas tareas que requieran transferencias de una gran cantidad de datos o múltiples peticiones de red, considera el uso de un enfoque asíncrono de modo que la interfaz de usuario se mantenga responsiva.
Ejemplo
Durante la generación de informes, acumula los datos en un buffer o estructura en memoria y, luego, aplica una única escritura sobre el archivo al final, en vez de decenas de pequeñas escrituras.
5 Presta atención a los bucles y operaciones con Strings
Los bucles anidados y la concatenación repetitiva de cadenas son operaciones particularmente lentas e impactan notablemente en el rendimiento.
- Minimiza los bucles anidados: combina o elimina los bucles que repitan el mismo trabajo de forma innecesaria. Por ejemplo, una única pasada que filtre u ordene datos es generalmente más rápido que dos bucles separados.
- Manejo eficiente de cadenas: la combinación de cadenas largas en un bucle mediante el uso del operador “+” puede degradar el rendimiento dado que las cadenas son inmutables en muchos lenguajes, y la concatenación repetida puede derivar en la reserva adicional de memoria adicional.
- Utiliza Add: si estás concatenando partes de una cadena de forma repetida, considera el uso de un array en combinación con String.FromArray para obtener un mejor rendimiento.
Ejemplo
En vez de hacer:
Var largeString As String For i As Integer = 0 To 1000 largeString = largeString + "line " + i.ToString Next
…recolecta las líneas en un array de String, luego utiliza String.FromArray(). Verás un incremento de velocidad significativo.
Conclusión
Optimizar el rendimiento de tus apps Xojo no tiene por qué resultar un proceso intimidante. Con las herramientas adecuadas (como el Perfilador de Código) y el enfocarse en estructuras de datos, el uso de hilos, una E/S eficiente y el uso razonable de los bucles y las operaciones con cadenas, puedes incrementar el rendimiento de tus apps al tiempo que se mantiene la experiencia de usuario sin interrupciones.
Recuerda cuantificar los resultados midiendo el rendimiento antes y después de cada cambio realizado. Mediante el perfilado contínuo de tu código crearás aplicaciones Xojo más eficientes y atractivas que hagan las delicias de tus usuarios.
¡Disfruta optimizando y no te olvides de compartir tus trucos de rendimiento y casos de éxito en la comunidad del Foro de Xojo!