Obtener el tiempo que tarda una macro en ejecutarse

Como programador, por lo general se debe buscar la manera más óptima de crear código VBA el cual haga uso de los recursos de manera más eficiente (como la memoria, almacenamiento en disco duro) y a su vez se ejecute en el menor tiempo posible (uso de CPU).

Para ello se puede recurrir a diversas estrategias tales como el implementar algoritmos eficientes, hacer uso de estructuras de datos, entre otras más. Pero en este caso les voy a mostrar una técnica llamada “Benchmark”, la cual básicamente se enfoca en saber el tiempo que tarda un fragmento de código en ejecutarse.

Lo más habitual es estimar cuánto tiempo le tomará a nuestro código ejecutarse y para ello hacemos una comparativa en el proceso de ejecución del programa, para ello podemos utilizar alguna de las dos siguientes opciones:

  • Uso de la función Now
  • Uso de la función Timer

Ya muchos conocen la función Now la cual devuelve la fecha y hora actuales, la cual se podría usar de la siguiente forma:

Sub BenchMark()
Dim Count As Long
Dim BenchMark As Double
Dim TimeStart As Double

'Comienza el codigo a evaluar
TimeStart = Now

For Count = 1 To 9000
Sheets(1).Cells(Count, 1) = "prueba"
Next Count

MsgBox CDbl(Now - TimeStart)
End Sub

Lo malo de este método es que no es tan preciso en la parte fraccionaria. Está el segundo método, usando la función Timer:

Sub BenchMark2()
Dim Count As Long
Dim BenchMark As Double
Dim TimeStart As Double

'Comienza el codigo a evaluar
TimeStart = Timer

For Count = 1 To 9000
Sheets(1).Cells(Count, 1) = "prueba"
Next Count

MsgBox CDbl(Timer - TimeStart)
End Sub

Este método nos da la parte fraccionaria de los segundos (es más preciso que el anterior), pero tiene las siguientes desventajas:
  • No sirve para estimar tiempos de procesos que duren más de un día (de lo contrario los resultados serán erróneos). ¿Más de un día?, ¿Quién puede usar o crear una macro que dure un día? En uno de mis trabajos anteriores tenían una macro que dejaban corriendo desde el viernes en la tarde y cuando llegaba el lunes aun la macro seguía corriendo… (Aunque usted no lo crea!)
  • No es precisa, tiene una precisión 1/18 segundos.
  • Si se corre un proceso antes de la media noche y el proceso termina pasada la medianoche, la estimación, será incorrecta. La misma documentación de la función lo dice: “Devuelve un tipo Single que representa el número de segundos transcurridos desde la medianoche.”
En una próxima entrega mostraré como crear una clase para realizar benchmark más preciso usando la API de windows y nos devuelva el resultado en milisegundos, segundos y minutos!


Comentarios