Valhalla Legends Forums Archive | General Programming | Loop Execution Timer

AuthorMessageTime
MrRaza
Here is a little tid-bit of code i found on my computer that Tests how fast your loops execute.
Create a Project.
Create a Module and add this code
[code]
Option Explicit

'API's to use
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Any) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Any) As Long

'Only three variables to use in this class
Dim Freq As Currency, TStart As Currency, TEnd As Currency

Public Property Get Frequency() As Currency
'This property only returns the clock frequency
Frequency = Freq
End Property

Private Sub Class_Initialize()
'Reset the Start and End timer variables
TStart = 0
TEnd = 0
'Return the clock frequency
QueryPerformanceFrequency Freq
If Freq <= 0 Then
'If for some reason the frequency is less than zero we are dealing with
'a high resolution clock. This is not supported with this class.
MsgBox "This timer class doesn't support high frequency clock's!"
Freq = 0
End If
End Sub

Public Sub Start()
'Return the current clock count
QueryPerformanceCounter TStart
'Reset the end result
TEnd = 0
End Sub

Public Sub StopNow()
'Return the current clock count
QueryPerformanceCounter TEnd
End Sub

Public Function Result() As Currency
'Do not return anything if the "StopNow" method is not called.
If TEnd = 0 Then
Result = -1
Exit Function
End If
'Double check to make sure the Frequency is not zero
If Freq <> 0 Then
'The time it took will equal the end time recorded, subtracting the start time
'and deviding by the frequency of the clock.
Result = (TEnd - TStart) / Freq
Else
'Return -1 if the clock frequency is to high
Result = -1
End If
End Function
[/code]

Now create a form with these properties:
Property | Name | value
TextBox txtResult ""
Label Label1 Results:
CommandButton btnTest Run Timer
Form frmTimerDemo

Now add this code to the form:
[code]
Dim TTime As New cTimeIt

Private Sub btnTest_Click()
Dim iCount As Long, sFunnyResult As String

'Reset some variables
sFunnyResult = "TEST"
iFunnyResult = 0
iCount = 0

'Start the timer
TTime.Start
For iCount = 1 To 1000000
'This should take more time than the Len(x) <> 0
'This is actualy a good example for optimizing code. Always rather compare
'the lenght of a variable than to compare it with "" (string nothing). The
'len function normaly executes 20%-25% faster.
If sFunnyResult <> "" Then
iFunnyResult = iFunnyResult + 1
End If
Next
'Stop the timer
TTime.StopNow

'Return the results
txtResult = txtResult & "For Next Loop with (x <> "") took : " & TTime.Result & " sec to execute." & vbCrLf & vbCrLf

'Reset some variables
sFunnyResult = "TEST"
iFunnyResult = 0
iCount = 0

'Start the timer
TTime.Start
For iCount = 1 To 1000000
'Now compare the len of string to 0
If Len(sFunnyResult) <> 0 Then
iFunnyResult = iFunnyResult + 1
End If
Next
'Stop the timer
TTime.StopNow

'Return the results
txtResult = txtResult & "For Next Loop with (Len(x) <> 0) took : " & TTime.Result & " sec to execute." & vbCrLf & vbCrLf

End Sub
[/code]
[img width=430 height=262]http://members.rogers.com/codenameavalon/graphics/timer.jpg[/img]

The commentation in the code also has some nice code optimization hints.
March 25, 2003, 1:54 PM
n00blar
somehow you need to figure out the overhead of TTime.Start and TTime.Stop
March 25, 2003, 4:43 PM
Skywing
Remember to boost your benchmarking thread's priority with SetThreadPriority. Additionally, for SMP testing, you might need to use SetThreadAffinityMask to control which processors it runs on.
March 25, 2003, 5:40 PM
Grok
Easy. Call Time.Start then Time.Stop.

Because all you are really interested in is a pair's overhead from the time the timer really starts until it really stops. The overhead before actual start and after actual stop, even though still in the method of Time.method, isn't relevant.
March 25, 2003, 5:41 PM

Search