Realizando “benchmark” en el rendimiento del código en VBA

Estándar

Algunos programadores siempre están buscando 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).

Lo más habitual es estimar cuanto tiempo le tomara a nuestro script ejecutarse y para ello hacemos una comparativa en el proceso de ejecución del programa, para ello muchos se valen de las dos siguientes técnicas:

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

En la primera 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

TimeStart = Now
'Comienza el codigo a evaluar

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

'End of Code to Test
MsgBox CDbl(Now - TimeStart)
End Sub


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


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

TimeStart = Timer
'Comienza el codigo a evaluar

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

'End of Code to Test
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 erroneos). ¿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 media noche, 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 la próxima entrega mostrare 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!

Saludos!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s