क्या VBA में कोई कोड है, मैं इसके साथ एक फंक्शन को लपेट सकता हूं, जिससे मुझे यह पता चल जाएगा कि इसे चलाने में कितना समय लगा है, ताकि मैं अलग-अलग कार्यों के समय की तुलना कर सकूं?
क्या VBA में कोई कोड है, मैं इसके साथ एक फंक्शन को लपेट सकता हूं, जिससे मुझे यह पता चल जाएगा कि इसे चलाने में कितना समय लगा है, ताकि मैं अलग-अलग कार्यों के समय की तुलना कर सकूं?
जवाबों:
जब तक आपके कार्य बहुत धीमे नहीं होते, तब तक आपको एक उच्च-रिज़ॉल्यूशन टाइमर की आवश्यकता होती है। सबसे सटीक मैं जानता हूं QueryPerformanceCounter
। अधिक जानकारी के लिए इसे Google निम्नलिखित को एक कक्षा में धकेलने का प्रयास करें, इसे 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
कर्नेल से आयात करना )।
StartCounter
और TimeElapsed
? मैंने CTimer
शुरुआत में एक उदाहरण टाइमर किया था और With StartCounter
मैंने .StartCounter
अपने उप के शुरू होने के बाद लिखा था .TimeElapsed
और इसने मुझे जवाब दिया Invalid use of property
। जब मैं .StartCounter
अकेला होता हूं तो यह बताता है कि कोई वस्तु सेट नहीं है।
Declare PtrSafe Function
stackoverflow.com/questions/21611744/…
वीबीए में टाइमर फ़ंक्शन आपको आधी रात के बाद से लेकर सेकंड के 1/100 तक की संख्या देता है।
Dim t as single
t = Timer
'code
MsgBox Timer - t
यदि आप स्टॉपवॉच की तरह समय को वापस करने की कोशिश कर रहे हैं तो आप निम्न एपीआई का उपयोग कर सकते हैं जो सिस्टम स्टार्टअप के बाद से मिलीसेकंड में समय लौटाता है:
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 में टाइमगेट टाइम पर आधारित एक समाधान का उपयोग किया है। देखHttp://www.aboutvb.de/kom/artikel/komstopwatch.htm
लेख जर्मन में है, लेकिन डाउनलोड में कोड (एक VBA वर्ग जो dll फ़ंक्शन कॉल को लपेटता है) लेख को पढ़ने में सक्षम होने के बिना उपयोग करने और समझने के लिए सरल है।
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. मैंने भी आपको पढ़ा है आधी रात को पार करते समय अगर ऐसा होता है तो गलत तरीके से पढ़ा जा सकता है, एक दुर्लभ उदाहरण लेकिन सिर्फ FYI करें।