optimization - كيف يمكنك اختبار وقت تشغيل رمز VBA؟




testing profiling (4)

إذا كنت تحاول إرجاع الوقت مثل ساعة توقيت ، فيمكنك استخدام واجهة برمجة التطبيقات التالية التي تعيد الوقت بالمللي ثانية منذ بدء تشغيل النظام:

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 معقدة للغاية بالنسبة للمهمة المطلوبة)

هل هناك تعليمات برمجية في VBA يمكنني أن أقوم بتغليف وظيفة من شأنها أن تسمح لي بمعرفة الوقت المستغرق للتشغيل ، حتى أتمكن من مقارنة أوقات التشغيل المختلفة للوظائف؟



لقد استخدمنا حلاً يستند إلى 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




performance