Optimizar el tiempo de ejecución de una función personalizada (macro)

Hay momentos en que nos interesa saber el tiempo que tarda en ejecutarse una función que hemos programado por si es posible optimizarla para que se ejecute en menos tiempo.

El lenguaje LibreOffice Basic nos aporta la función GetSystemTicks() que, de acuerdo con la Ayuda de LibreOffice Basic: “Devuelve la cantidad de ticks del sistema proporcionados por el sistema operativo. Puede utilizar esta función para optimizar determinados procesos”. Un “tick” tiene una duración aproximada de un milisegundo (dependiendo del hardware). A las 00:00:00 de cada día se reinician los ticks del sistema, así que, el número devuelto (entero largo, long integer) por esta función es, aproximadamente, el número de milisegundos transcurridos desde la medianoche pasada. En mi sistema (PC Windows 11 24H2 64 bits con 16 GB de RAM y procesador AMD Ryzen 5 1600 Six-Core Processor 3.20 GHz), el ejemplo de la imagen 1, tarda en ejecutarse una media de 2006 ticks (he realizado varias mediciones).

Imagen 1: Función GetSystemTicks(). Ayuda de LibreOffice Basic.

Vamos a comprobar cuánto tiempo tarda en ejecutarse una función personalizada que calcula los dígitos de control de una cuenta bancaria e intentaremos optimizarla para que se ejecute en el menor tiempo posible. También nos tendremos que preguntar, ¿nos interesa sacrificar la legibilidad y la claridad por la velocidad? Pues depende de lo que interese en cada momento.

Comencemos con la función personalizada. Una cuenta bancaria tiene 20 dígitos:

  • Los cuatro primeros corresponden al código de la entidad bancaria, de acuerdo con el código de supervisor del Banco de España.

  • Los cuatro siguientes corresponden al código de la sucursal de esa entidad.

  • Los dos siguientes son los dígitos de control.

  • Los diez últimos corresponden al número de cuenta.

El primero de los dígitos de control se calcula operando con los dígitos de la entidad y de la sucursal. El segundo con los dígitos del número de cuenta. ¿Y qué cálculos se realizan? Se multiplica, por orden y empezando por la izquierda, cada uno de los dígitos de la entidad por 7, 3, 6, 1. Después cada uno de los dígitos de la sucursal por 2, 4, 8, 5. Se suman todos los resultados parciales y este resultado final se divide entre 11. El resto de esta división es el primer dígito de control. Para el segundo dígito de control operamos de la misma manera, pero esta vez con los dígitos del número de cuenta, siendo los factores multiplicativos 10, 9, 7, 3, 6, 1, 2, 4, 8, 5.

La primera versión de la función la vemos en la imagen 2. En principio muy legible y clara.

Imagen 2: Función personalizada digito_control().

Vamos a utilizar la macro de la imagen 3 para medir el tiempo empleado por nuestra función y las distintas versiones. Realizaremos 1.000 repeticiones y mediremos el tiempo, en segundos, que tarda cada una de las versiones de la función original.

Imagen 3: Macro para medir el tiempo empleado en 1.000 repeticiones (no completa).

El tiempo empleado por la función original de la imagen 2 (recordemos, 1.000 repeticiones en mi PC) es de 0,328 segundos.

La siguiente versión, imagen 4, elimina los bucles FOR y sustituye los vectores (ARRAY) con los factores multiplicativos por sus valores correspondientes directamente en el código. Esta versión emplea 0,167 segundos. Aproximadamente la mitad del tiempo empleado por la función original. Vamos mejorando.

Imagen 4: Versión 3 de la función personalizada.

Por último, la versión 6 (imagen 5) es la que se ejecuta más rápidamente. Emplea 0,153 segundos por cada 1.000 repeticiones. Realiza todos los cálculos en una línea de código.

Imagen 5: Versión 6 de la función personalizada.

El resto de versiones las podéis consultar en el archivo de prácticas descargable.

Ya lo dijo Platón: “El que aprende y aprende y no practica lo que sabe es como el que ara y ara y no siembra". Así que ya sabéis, haced caso y practicad, practicad, …, practicad y no os olvidéis de las copias de seguridad.

Como siempre, muchas gracias por vuestra atención y saludos cordiales.

LibreOffice Community versión 24.2.7 (X86_64 es-ES) Windows 11


Se puede descargar el archivo de prácticas aquí.

Comentarios