View member feedback to this tip.
Ever wondered where the bottleneck is that makes you code so darn slow? With the lsTimer class below, you can easily pinpoint any time-consuming method, property, event, agent or any other piece of LotusScript code.
Whenever you want to measure more than one method in the same scope, make the lsTimer class global.
Global (Whatever)
Options:
Option Public
Use "class.tools.lstimer"
Declaration:
Dim ticker as lstimer
Initialize:
Sub Initialize
Set ticker = New lsTimer()
End Sub
End Global
Public Function myFunction()
Call ticker.start()
' your code goes here
Call ticker.stop()
Call ticker.out(Lsi_info(12), True)
End function
Code: %REM
Create a smart icon with the
@functions below to easily toggle
the lsTimer
mode on and off.
@If(@Environment("UserlsTimerMode")
= "0";
@Do(
@Environment("UserlsTimerMode";"1");
@Prompt([OK];"lsTimer ON";"lsTimer
is now ON"));
@Do(
@Environment("UserlsTimerMode";"0");
@Prompt([OK];"lsTimer OFF";"lsTimer
is now OFF")))
%END REM
' include lsconst & lserr.
%INCLUDE "lsconst.lss"
%INCLUDE "lserr.lss"
Type recTicks
startTick As Single
stopTick As Single
mode As Integer
End Type
''
Private Const LIB_PACKAGE =
"class.tools.lstimer"
'' Class to measure execution time of
methods and properties in a LotusScript
library.
' @see class.tools.debug
Public Class lstimer
Private s As notessession
Private status As Integer
Private ticker List As recTicks
Private tmpTick As Single
'' Construct new instance
' @param None
Public Sub new()
Set s = New notessession
status = ( s.getEnvironmentString
( "UserlsTimerMode" ) = "1" )
End Sub
'' Class destructor
' @param None
Public Sub delete()
Erase ticker
End Sub
'' Start a new timer for the calling method
' @return Allways returns True
' @see stop
Public Function start() As Integer
Me.start = True
ticker(Lsi_info(12)).mode = True
ticker(Lsi_info(12)).stopTick = 0
ticker(Lsi_info(12)).startTick =
Getthreadinfo
(LSI_THREAD_TICKS)
End Function
''Stop timer function for the calling method.
Stop() must be called prior
to calling the out() method.
'@return True if selected timer was
stopped successfully otherwise return
False
'@see start
Public Function stop() As Integer
tmpTick = Getthreadinfo(LSI_THREAD_TICKS)
If ( Iselement(ticker(Lsi_info(12))) = True ) Then
tmpTick = tmpTick - ticker(Lsi_info(12)).startTick
ticker(Lsi_info(12)).stopTick = ticker(Lsi_info
(12)).stopTick + tmpTick
ticker(Lsi_info(12)).mode = False'
Me.stop = True
End If
End Function
''Resume a previous stopped timer
function for the calling method
'@return True if resumed successfully
otherwise return False
'@see stop
Public Function resume() As Integer
tmpTick = Getthreadinfo
(LSI_THREAD_TICKS)
If ( Iselement(ticker(Lsi_info(12))) = True )
Then
ticker(Lsi_info(12)).mode = True
ticker(Lsi_info(12)).startTick = tmpTick
Me.resume = True
End If
End Function
''Print the total execution time for the
calling method
'@param argREF The name of the calling
method ( use Lsi_info(12) )
'@param argMode If True the execution time
is calculated in seconds otherwise
it is calculated in ticks
'@return True if output was successfully
otherwise return False if the timer
for the calling method is running
'@see stop
Public Function out(Byval argREF
As String, argMode As Integer) As
Integer
If Not ( Status = True ) Then Exit Function
If ( Iselement(ticker(Lsi_info(12))) = True )
Then
out = True
If ( ticker(Lsi_info(12)).mode = True ) Then
Print "ticker: " & Lsi_info(12) & " is running"
out = False
Exit Function
End If
If ( argMode = True ) Then
Dim secs As Single
secs = ticker(Lsi_info(12)).stopTick /
ticksPerSecs()
Print "ticker:" & Lsi_info(12) & ":" argREF
& "( " & Cstr(secs) & " sec)"
Else
Print "ticker:" & Lsi_info(12) & ":" argREF
& "( " & Cstr(ticker(Lsi_info(12)).stopTick)
& " tick)"
End If
End If
End Function
'' Erase timer for calling methods
'@return True if timer was successfully
erased otherwise return False
Public Function erase() As Integer
If ( ticker(Lsi_info(12)).mode = True )
Then
Print "ticker: " & Lsi_info(12) & " is
running, could
not erase timer"
Me.erase = False
Exit Function
Else
Erase ticker
Me.erase = True
End If
End Function
'---Private methods ---
Private Function ticksPerSecs()
As Integer
ticksPerSecs = Getthreadinfo
(LSI_THREAD_TICKS_PER_SEC)
End Function
End Class
This system would appear to be an incredibly complex way of determining execution time. I use the following three lines of code:
Dim start as Double start = Timer() ' your code goes here Print ( Timer() - start )
The Timer function is accurate to 1/100 of a second. Anything shorter than that would be unapparent to the user and therefore not worth measuring. Multiple measurement points may be calculated by adding other double variables as needed.
What are the advantages, if any, of using Jens Nielsen's method?
Jack S.
Do you have comments on this tip? Let us know.
This tip was submitted to the SearchDomino.com tip exchange by member Jens Nielsen. Please let others know how useful it is via the rating scale below. Do you have a useful Notes/Domino tip or code to share? Submit it to our monthly tip contest and you could win a prize and a spot in our Hall of Fame.
This was first published in June 2004