2011-08-18 34 views
13

¿Cuál es la forma más precisa de comparar el código VBA (en mi caso, estoy probando el código en Excel)? ¿Existen otras técnicas para el código de evaluación comparativa además de las 2 a continuación, y si es así, cuáles son los pros/contras del método?Benchmarking VBA Code

Aquí hay 2 métodos populares.

Primero: temporizador

Sub TimerBenchmark() 

Dim benchmark As Double 
benchmark = Timer 

'Do your code here 

MsgBox Timer - benchmark 

End Sub 

Y Tick (que veo argumentado como el más exacto):

Option Explicit 
Private Declare Function GetTickCount Lib "kernel32"() As Long 

Sub TickBenchmark() 

Dim Start As Long 
Dim Finish As Long 

Start = GetTickCount() 

'Do your code here 

Finish = GetTickCount() 
MsgBox CStr((Finish - Start)/1000) 

End Sub 

Respuesta

13

El siguiente código utiliza una función de Windows que es más precisa que Excel. Se toma desde http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_MakingWorkbooksCalculateFaster. La misma página también contiene algunas sugerencias sobre cómo mejorar el rendimiento en Excel 2007.

Private Declare Function getFrequency Lib "kernel32" _ 
Alias "QueryPerformanceFrequency" (cyFrequency As Currency) As Long 
Private Declare Function getTickCount Lib "kernel32" _ 
Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long 

Function MicroTimer() As Double 

    'Returns seconds. 

    Dim cyTicks1 As Currency 
    Static cyFrequency As Currency 
    MicroTimer = 0 

    ' Get frequency. 
    If cyFrequency = 0 Then getFrequency cyFrequency 

    ' Get ticks. 
    getTickCount cyTicks1        

    ' Seconds 
    If cyFrequency Then MicroTimer = cyTicks1/cyFrequency 
End Function 
+1

Este enlace es de oro! ¡Gracias! – aevanko

+1

El autor de esa pieza es un colaborador habitual de Stackoverflow. Su propio sitio web tiene mucha más información excelente sobre Excel y el rendimiento: http://www.decisionmodels.com/ – jtolle

+1

¿Podría resumir el código en el enlace de su respuesta para evitar que se pudra el enlace? Además, el código de microtímdor suministrado no parece funcionar en Excel de 64 bits. ¿Hay alguna alternativa para los usuarios de 64 bits? – StockB

6

pregunta interesante. Esta no es realmente una respuesta completa, pero esto es demasiado largo para ser publicado como un comentario.
lo que uso es este tipo de procedimiento:

Option Explicit 
Public Time As Double 
Sub Chrono() 
If Time = 0 Then 
    Time = Now() 
Else 
    MsgBox "Total time :" & Application.Text(Now() - _ 
     Time, "mm:ss") & "." 'or whatever if not a msgbox 
    Time = 0 
End If 
End Sub 

esta manera, usted puede poner su código donde quiera y sólo tiene que llamar dos veces (por ejemplo):

If C_DEBUG Then Call Chrono 

Al comenzando y al final de la parte del código que desea probar.

Sin embargo, diría que no existe un método real "preciso" porque también depende de qué se está ejecutando en su computadora. Yo diría que estos métodos en su mayoría ayudaría a decir qué código es mejor que otro.

2

Cualquier medición va a ser ruidosa, por lo que si quiere precisión, repita la medición muchas veces y promedie el resultado.

1

Professional Excel Development contiene una utilidad DLL PerfMon que prefiero, por su precisión, y como se puede insertar fácilmente a través de código con un par de menú clics