bestsource

VBA 코드 벤치마킹

bestsource 2023. 11. 5. 14:49
반응형

VBA 코드 벤치마킹

VBA 코드를 벤치마킹하는 가장 정확한 방법은 무엇입니까(제 경우 엑셀에서 코드를 테스트하고 있습니다)?아래 2가지 이외에 코드를 벤치마킹하는 다른 기법이 있습니까? 만약 그렇다면 그 방법의 장단점은 무엇입니까?

여기에 대중적인 두 가지 방법이 있습니다.

첫번째: 타이머

Sub TimerBenchmark()

Dim benchmark As Double
benchmark = Timer

'Do your code here

MsgBox Timer - benchmark

End Sub

그리고 Tick(가장 정확하다고 주장하는):

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

다음 코드는 엑셀보다 더 정확한 윈도우 기능을 사용합니다.이것은 http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_MakingWorkbooksCalculateFaster 에서 가져온 것입니다.같은 페이지에 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

재미있는 질문.이것은 사실 완전한 답은 아니지만 댓글로 올리기에는 너무 깁니다.
제가 사용하는 방법은 다음과 같습니다.

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

이렇게 하면 원하는 곳에 코드를 넣을 수 있고 두 번만 호출하면 됩니다(예:

If C_DEBUG Then Call Chrono

테스트할 코드의 처음과 끝에 있습니다.

하지만 컴퓨터에서 실행 중인 것에 따라서도 달라지기 때문에 진짜 "정확한" 방법은 없다고 생각합니다.이 방법들은 어떤 코드가 다른 코드보다 더 나은지 알려주는 데 대부분 도움이 될 것입니다.

모든 측정값은 잡음이 발생하므로 정밀도를 원하는 경우 측정을 여러 번 반복하고 결과를 평균합니다.

Professional Excel Development에는 dll 유틸리티가 포함되어 있습니다.PerfMon그것의 정확성을 위해, 그리고 그것은 몇번의 메뉴 클릭으로 코드 전체에 쉽게 삽입될 수 있기 때문에 내가 선호하는 것.

Ronnie Dickson이 답한 것처럼 쿼리 성능 카운터 기능은 (brettdj가 제안한 것처럼 dll을 사용하고 싶지 않을 때) VBA 코드를 벤치링하는 가장 정확한 방법입니다.저는 그 기능을 사용하기 쉽게 만드는 클래스를 작성했습니다: 벤치마크 클래스 초기화 + 코드 사이에 메소드 호출.예를 들어, 시간을 빼거나, 시간을 다시 초기화하고, 디버그하기 위해 코드를 쓸 필요가 없습니다.

Sub TimerBenchmark()

Dim bm As New cBenchmark

'Some code here
bm.Wait 0.0001
bm.TrackByName "Some code"

'Some more (time consuming) code here
bm.Wait 0.04
bm.TrackByName "Bottleneck code"

End Sub

판독 가능한 표를 즉시 창에 자동으로 인쇄합니다.

IDnr  Name             Count  Sum of tics  Percentage  Time sum
0     Fast code            1       25.136       5,91%   2,51 ms
1     Bottleneck code      1      400.316      94,09%     40 ms
      TOTAL                2      425.452     100,00%     43 ms

Total time recorded:             43 ms

클래스는 a를 포함합니다.Application과 동일한 Wait 기능.잠시만요. 시간 값이 아닌 초 단위의 입력만 필요합니다.위에서 일부 코드를 시뮬레이션하는 데 사용됩니다.

https://github.com/jonadv/VBA-Benchmark

언급URL : https://stackoverflow.com/questions/7103552/benchmarking-vba-code

반응형