SET PROCEDURE TO cusStopWatch.PRG ADDITIVE >LOCAL m.loStopWatch, m.lcStartBuffer >m.loStopWatch = CREATEOBJECT("cusStopWatch") >m.lcStartBuffer = m.loStopWatch.Start() >FOR m.i = 1 TO 5000 > a=TRANSFORM(m.i) >ENDFOR m.i >? "Elapsed time in seconds: " ; > + TRANSFORM(m.loStopWatch.Stop(m.lcStartBuffer))>
DEFINE CLASS cusStopWatch AS Timer PROTECTED inTicksPerSecond PROTECTED wrapTime wrapTime = 0 HIDDEN PROCEDURE Init PRIVATE randomName STORE SYS(2015) to randomName DECLARE INTEGER QueryPerformanceFrequency IN kernel32 AS (m.randomName) STRING @lpFrequency LOCAL lcCurrentBuffer STORE " " TO lcCurrentBuffer ? m.randomName+"(@m.lcCurrentBuffer)" =EVALUATE(m.randomName+"(@m.lcCurrentBuffer)") CLEAR DLLS &randomName THIS.inTicksPerSecond = CTOBIN(LEFT(m.lcCurrentBuffer, 4),"RS") + CTOBIN(RIGHT(m.lcCurrentBuffer, 4),"RS") * 2^32 LOCAL ARRAY laDLLS[1] ADLLS(laDlls) IF EMPTY(ASCAN(laDLLs,"QueryPerformanceCounter",1,-1,2,15)) DECLARE INTEGER QueryPerformanceCounter IN kernel32 STRING @lpPerformanceCount ENDIF PRIVATE wrapTime STORE 0 TO wrapTime FOR k=0 to 1000 STORE m.wrapTime + this.Stop(this.Start()) TO wrapTime NEXT this.wrapTime = m.wrapTime/m.k ENDPROC PROCEDURE Start PRIVATE lcStartBuffer STORE " " TO lcStartBuffer =QueryPerformanceCounter(@m.lcStartBuffer) *The state of the start buffer must be *preserved so pass it back. This permits *multiple callers to use this same *cusStopWatch instance, simultaneously. RETURN m.lcStartBuffer ENDPROC PROCEDURE Stop LPARAMETERS tcStartBuffer PRIVATE lcCurrentBuffer STORE " " TO lcCurrentBuffer =QueryPerformanceCounter(@m.lcCurrentBuffer) RETURN ( CTOBIN(LEFT(m.lcCurrentBuffer, 4),"RS") - CTOBIN(LEFT(m.tcStartBuffer, 4),"RS") ; + 2^32 * (CTOBIN(RIGHT(m.lcCurrentBuffer, 4),"RS") - CTOBIN(RIGHT(m.tcStartBuffer, 4),"RS"))) ; / m.THIS.inTicksPerSecond - - m.this.wrapTime ENDPROC ENDDEFINE