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
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
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.”
Comentarios
Publicar un comentario