Có mã nào trong VBA mà tôi có thể bọc một hàm mà sẽ cho tôi biết thời gian nó chạy để tôi có thể so sánh thời gian chạy khác nhau của các hàm không?
Có mã nào trong VBA mà tôi có thể bọc một hàm mà sẽ cho tôi biết thời gian nó chạy để tôi có thể so sánh thời gian chạy khác nhau của các hàm không?
Câu trả lời:
Trừ khi các chức năng của bạn rất chậm, bạn sẽ cần một bộ đếm thời gian có độ phân giải rất cao. Cái chính xác nhất mà tôi biết là QueryPerformanceCounter
. Google nó để biết thêm thông tin. Hãy thử đẩy phần sau vào một lớp, gọi nó là CTimer
say, sau đó bạn có thể tạo một phiên bản ở đâu đó trên toàn cầu và chỉ cần gọi .StartCounter
và.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()
cho kết quả tính bằng mili giây. Tôi không thực hiện bất kỳ khoản bồi thường chi phí nào vì tôi lo lắng về ảnh hưởng của hiện tượng nói lắp trong tính toán chi phí hơn là độ chính xác hoàn hảo.
GetTickCount
từ kernel32).
StartCounter
Và TimeElapsed
? Tôi đã làm một ví dụ Timer CTimer
ở đầu và With StartCounter
tôi chỉ viết .StartCounter
sau khi phụ của tôi bắt đầu .TimeElapsed
và nó đã trả lời tôi Invalid use of property
. Khi tôi mặc .StartCounter
kệ nó cho tôi biết một đối tượng chưa được thiết lập.
Declare PtrSafe Function
stackoverflow.com/questions/21611744/…
Chức năng Hẹn giờ trong VBA cung cấp cho bạn số giây đã trôi qua kể từ nửa đêm, đến 1/100 giây.
Dim t as single
t = Timer
'code
MsgBox Timer - t
Nếu bạn đang cố gắng trả lại thời gian giống như một chiếc đồng hồ bấm giờ, bạn có thể sử dụng API sau để trả về thời gian tính bằng mili giây kể từ khi khởi động hệ thống:
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
sau http://www.pcreview.co.uk/forums/grab-time-milliseconds-included-vba-t994765.html (vì timeGetTime trong winmm.dll không hoạt động đối với tôi và QueryPerformanceCounter quá phức tạp đối với tác vụ cần thiết)
Public Declare Function ...
gì? Nó tạo ra một lỗi khi thêm mã của bạn ở dưới cùng của tôi
Đối với người mới, các liên kết này giải thích cách tạo hồ sơ tự động của tất cả các đăng ký mà bạn muốn theo dõi thời gian:
http://www.nullskull.com/a/1602/profiling-and-optimizing-vba.aspx
http://sites.mcpher.com/share/Home/excelquirks/optimizationlink xem procProfiler.zip trong http://sites.mcpher.com/share/Home/excelquirks/downlable-items
Sub Macro1()
Dim StartTime As Double
StartTime = Timer
''''''''''''''''''''
'Your Code'
''''''''''''''''''''
MsgBox "RunTime : " & Format((Timer - StartTime) / 86400, "hh:mm:ss")
End Sub
Đầu ra:
RunTime: 00:00:02
Chúng tôi đã sử dụng một giải pháp dựa trên timeGetTime trong winmm.dll cho độ chính xác mili giây trong nhiều năm. Xem http://www.aboutvb.de/kom/artikel/komstopwatch.htm
Bài viết bằng tiếng Đức, nhưng mã trong bản tải xuống (một lớp VBA gói lệnh gọi hàm dll) đủ đơn giản để sử dụng và hiểu mà không cần đọc bài viết.
Giây có 2 dấu cách thập phân:
Dim startTime As Single 'start timer
MsgBox ("run time: " & Format((Timer - startTime) / 1000000, "#,##0.00") & " seconds") 'end timer
Mili giây:
Dim startTime As Single 'start timer
MsgBox ("run time: " & Format((Timer - startTime), "#,##0.00") & " milliseconds") 'end timer
Mili giây với dấu phân cách dấu phẩy:
Dim startTime As Single 'start timer
MsgBox ("run time: " & Format((Timer - startTime) * 1000, "#,##0.00") & " milliseconds") 'end timer
Chỉ để lại điều này ở đây cho bất kỳ ai đang tìm kiếm một bộ đếm thời gian đơn giản được định dạng từ giây đến 2 dấu cách thập phân như tôi. Đây là những bộ hẹn giờ ngắn và ngọt ngào mà tôi thích sử dụng. Chúng chỉ chiếm một dòng mã ở đầu sub hoặc chức năng và một dòng mã lại ở cuối. Những điều này không có nghĩa là chính xác đến điên rồ, tôi thường không quan tâm đến bất cứ điều gì ít hơn 1/100 giây cá nhân, nhưng bộ đếm thời gian mili giây sẽ cung cấp cho bạn thời gian chạy chính xác nhất trong số 3. Tôi cũng đã đọc bạn có thể đọc sai nếu nó xảy ra chạy khi vượt quá nửa đêm, một trường hợp hiếm gặp nhưng chỉ là FYI.