optimization - كيف يمكنك اختبار وقت تشغيل رمز VBA؟
testing profiling (4)
هل هناك تعليمات برمجية في VBA يمكنني أن أقوم بتغليف وظيفة من شأنها أن تسمح لي بمعرفة الوقت المستغرق للتشغيل ، حتى أتمكن من مقارنة أوقات التشغيل المختلفة للوظائف؟
إذا كنت تحاول إرجاع الوقت مثل ساعة توقيت ، فيمكنك استخدام واجهة برمجة التطبيقات التالية التي تعيد الوقت بالمللي ثانية منذ بدء تشغيل النظام:
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 (كما كان timeGetTime في winmm.dll لا يعمل بالنسبة لي وكان QueryPerformanceCounter معقدة للغاية بالنسبة للمهمة المطلوبة)
بالنسبة إلى newbees ، تشرح هذه الارتباطات كيفية إجراء تحديد تلقائي لجميع الغواصات التي تريد مراقبتها في الوقت:
http://www.nullskull.com/a/1602/profiling-and-optimizing-vba.aspx
http://sites.mcpher.com/share/Home/excelquirks/optimizationlink راجع procProfiler.zip في http://sites.mcpher.com/share/Home/excelquirks/downlable-items
لقد استخدمنا حلاً يستند إلى timeGetTime في winmm.dll لدقة مللي ثانية لسنوات عديدة. انظر http://www.aboutvb.de/kom/artikel/komstopwatch.htm
المقالة باللغة الألمانية ، ولكن التعليمات البرمجية في التنزيل (فئة VBA التفاف استدعاء دالة dll) بسيطة كافية لاستخدام وفهم دون القدرة على قراءة المقال.
ما لم تكن مهامك بطيئة للغاية ، ستحتاج إلى جهاز توقيت عالي الدقة للغاية. الأكثر دقة واحد وأنا أعلم QueryPerformanceCounter
. جوجل انها لمزيد من المعلومات. حاول دفع ما يلي إلى فصل CTimer
، قم باستدعاء الأمر 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