2008-10-13 6 views

ответ

67

Если ваши функции не очень медленные, вам понадобится таймер с очень высоким разрешением. Самый точный, который я знаю, - 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 
+2

Я реализовал это в Excel VBA (добавление в Overhead, как указано в этой статье базы знаний: http://support.microsoft.com/kb/172338. Он отлично работал. Благодарю. – 2008-10-14 22:55:30

+1

Спасибо, это хорошо работает и для меня. `TimeElapsed()` дает результат в миллисекундах. Я не реализовал компенсацию накладных расходов, потому что меня больше беспокоило влияние заикания в накладных расходах, чем совершенная точность. – Justin 2011-01-11 15:59:53

+1

Это много подслушивает (в строках кода для управления) - если вы можете жить с точностью ~ 10 мс, @ ниже ответ Kodak дает то же самое в одной строке кода (импортируя «GetTickCount» из kernel32). – BrainSlugs83 2014-03-08 00:45:24

2

Мы использовали решение, основанное на timeGetTime в winmm.dll для точности миллисекунды на протяжении многих лет. См. http://www.aboutvb.de/kom/artikel/komstopwatch.htm

Статья написана на немецком языке, но код загрузки (класс VBA, завершающий вызов функции dll) достаточно прост, чтобы использовать и понимать, не имея возможности прочитать статью.

39

Функция таймера в VBA дает вам количество секунд, прошедших с полуночи, до 1/100 секунды.

Dim t as single 
t = Timer 
'code 
MsgBox Timer - t 

Если вам нужно большее разрешение, я бы просто выполнил функцию 1000 раз и разделил общее время на 1000.

25

Если вы пытаетесь вернуть время как секундомер можно использовать следующий 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 (как timeGetTime в winmm.dll не было работа для меня и QueryPerformanceCounter была слишком сложной для выполнения этой задачи необходимо)

Смежные вопросы