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
'bestsource' 카테고리의 다른 글
Woocommerce에서 후크를 통해 루프 제품 이미지 사용자 정의 (0) | 2023.11.05 |
---|---|
소켓 옵션이 리스닝 소켓에서 수락()을 통해 상속됩니까? (0) | 2023.11.05 |
사용자 기본값에 대한 NS코딩으로 사용자 지정 Swift 클래스 저장 (0) | 2023.11.05 |
MySQL 워크벤치와 MAMP PRO를 연결하는 방법은? (0) | 2023.11.05 |
mariadb REGEXP_INSTR은 괄호를 사용할 때 0 또는 1을 반환합니다. (0) | 2023.11.05 |