VBA에 실행에 걸린 시간을 알려주는 함수를 래핑 할 수있는 코드가있어 함수의 다른 실행 시간을 비교할 수 있습니까?
답변:
기능이 매우 느리지 않는 한 매우 고해상도 타이머가 필요합니다. 내가 아는 가장 정확한 것은 QueryPerformanceCounter
입니다. 더 많은 정보를 원하시면 구글을하세요. 다음을 클래스에 밀어 넣고 CTimer
말한 다음 인스턴스를 전역 어딘가에 만들고 호출 .StartCounter
하고.TimeElapsed
Option Explicit
Private Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Private m_CounterStart As LARGE_INTEGER
Private m_CounterEnd As LARGE_INTEGER
Private m_crFrequency As Double
Private Const TWO_32 = 4294967296# ' = 256# * 256# * 256# * 256#
Private Function LI2Double(LI As LARGE_INTEGER) As Double
Dim Low As Double
Low = LI.lowpart
If Low < 0 Then
Low = Low + TWO_32
End If
LI2Double = LI.highpart * TWO_32 + Low
End Function
Private Sub Class_Initialize()
Dim PerfFrequency As LARGE_INTEGER
QueryPerformanceFrequency PerfFrequency
m_crFrequency = LI2Double(PerfFrequency)
End Sub
Public Sub StartCounter()
QueryPerformanceCounter m_CounterStart
End Sub
Property Get TimeElapsed() As Double
Dim crStart As Double
Dim crStop As Double
QueryPerformanceCounter m_CounterEnd
crStart = LI2Double(m_CounterStart)
crStop = LI2Double(m_CounterEnd)
TimeElapsed = 1000# * (crStop - crStart) / m_crFrequency
End Property
TimeElapsed()
결과를 밀리 초 단위로 제공합니다. 완벽한 정확도보다 오버 헤드 계산에서 버벅 거림이 미치는 영향에 대해 더 걱정했기 때문에 오버 헤드 보상을 구현하지 않았습니다.
GetTickCount
kernel32에서 가져 오기 ).
StartCounter
And를 어떻게 사용 TimeElapsed
합니까? 처음에는 인스턴스 타이머를 CTimer
했고 서브가 시작된 후 With StartCounter
방금 썼는데 응답이 나왔습니다 . 나는 물론 개체가 설정되지 않았다고 말할 때 . .StartCounter
.TimeElapsed
Invalid use of property
.StartCounter
Declare PtrSafe Function
stackoverflow.com/questions/21611744/…
VBA의 타이머 기능은 자정 이후 경과 된 시간 (초의 1/100 초)을 제공합니다.
Dim t as single
t = Timer
'code
MsgBox Timer - t
스톱워치처럼 시간을 반환하려는 경우 시스템 시작 이후 시간을 밀리 초 단위로 반환하는 다음 API를 사용할 수 있습니다.
Public Declare Function GetTickCount Lib "kernel32.dll" () As Long
Sub testTimer()
Dim t As Long
t = GetTickCount
For i = 1 To 1000000
a = a + 1
Next
MsgBox GetTickCount - t, , "Milliseconds"
End Sub
http://www.pcreview.co.uk/forums/grab-time-milliseconds-included-vba-t994765.html 이후 (winmm.dll의 timeGetTime이 작동하지 않았고 QueryPerformanceCounter가 필요한 작업에 너무 복잡했기 때문에)
Public Declare Function ...
부분 은 무엇입니까 ? 광산의 하단에 코드를 추가 할 때 오류가 생성
newbees의 경우 다음 링크는 시간을 모니터링하려는 모든 구독자의 자동 프로파일 링을 수행하는 방법을 설명합니다.
http://www.nullskull.com/a/1602/profiling-and-optimizing-vba.aspx
http://sites.mcpher.com/share/Home/excelquirks/optimizationlink http://sites.mcpher.com/share/Home/excelquirks/downlable-items 에서 procProfiler.zip을 참조하십시오.
Sub Macro1()
Dim StartTime As Double
StartTime = Timer
''''''''''''''''''''
'Your Code'
''''''''''''''''''''
MsgBox "RunTime : " & Format((Timer - StartTime) / 86400, "hh:mm:ss")
End Sub
산출:
런타임 : 00:00:02
우리는 수년 동안 밀리 초 정확도를 위해 winmm.dll의 timeGetTime 기반 솔루션을 사용해 왔습니다. 참조 http://www.aboutvb.de/kom/artikel/komstopwatch.htm를
이 기사는 독일어로되어 있지만 다운로드 코드 (dll 함수 호출을 래핑하는 VBA 클래스)는 기사를 읽지 않고도 사용하고 이해할 수있을만큼 간단합니다.
소수점 2 자리가있는 초 :
Dim startTime As Single 'start timer
MsgBox ("run time: " & Format((Timer - startTime) / 1000000, "#,##0.00") & " seconds") 'end timer
밀리 초 :
Dim startTime As Single 'start timer
MsgBox ("run time: " & Format((Timer - startTime), "#,##0.00") & " milliseconds") 'end timer
쉼표 구분자를 사용한 밀리 초 :
Dim startTime As Single 'start timer
MsgBox ("run time: " & Format((Timer - startTime) * 1000, "#,##0.00") & " milliseconds") 'end timer
제가 그랬던 것처럼 소수점 이하 2 자리까지의 초 단위로 포맷 된 간단한 타이머를 찾는 사람을 위해 여기에 남겨 두세요. 이것들은 내가 사용하는 짧고 달콤한 작은 타이머입니다. 하위 또는 함수의 시작 부분에서 한 줄의 코드 만 차지하고 끝에서 다시 한 줄의 코드를 차지합니다. 이것은 엄청나게 정확한 것은 아닙니다. 저는 개인적으로 1/100 초 미만의 것은 신경 쓰지 않지만, 밀리 초 타이머는이 3 번의 가장 정확한 실행 시간을 제공 할 것입니다. 자정을 넘어가는 동안 실행되는 경우, 드문 경우이지만 참고로 잘못된 판독 값을 얻을 수 있습니다.