High Resolution Interval Counter

  To Compare reletive speed of different versions of program code. or some other thing you want to compare.

It is not a replacement for Waitable Timer or Realtime time stamp.


Include file Source Code

API function QueryPerformanceCounter() is easy enough to use, but requires you to provide two QUADs and code for a subtraction. Is presented as an #INCLUDE file because FASTPROC can not use COMMON or EXPORT, which is needed to make an SLL or DLL of it. The demo, below, compares using the API function directly with the FASTPROCs in this include file. These FASTPROCs "hide" the second QUAD, its pointer, and the subtraction to operate like TIX. They are more stable than TIX, and better resolution than GetTickCount() or GetTickCount64(), due use of QueryPerformanceCounter().


'HR_Interval.inc

'A stable high resolution interval counter.

'

'This version of the API DECLARE uses BYVAL for the parameter instead of 

'BYREF, the default when not specified. Else the user would need to add BYVAL

'in the calls to the FASTPROCs (less "hidden").

declare function QueryPerformanceCounterFP lib "Kernel32.dll" _

   alias "QueryPerformanceCounter" (byval pPerformanceCount as dword) as long

global gEndCountOfHRInterval as quad

global gpEndCountOfHRInterval as dword

'

fastproc HR_Interval (byval pCnt as long)

  gpEndCountOfHRInterval = varptr(gEndCountOfHRInterval)

  QueryPerformanceCounterFP pCnt

end fastproc



fastproc End_HR_Interval (byval pCnt as long)

  QueryPerformanceCounterFP gpEndCountOfHRInterval

  poke quad, pCnt, peek(quad, gpEndCountOfHRInterval) - peek(quad, pCnt)

end fastproc 


Demo Source Code

Shows both direct use of API function, and use of FASTPROCs.


#compile exe

#dim all

#if %pb_cc32 'Ignored in PBWin, stops unneeded console in PBCC.

  #console off

#endif

'Copied from \WinAPI\WinBase.inc so it can be seen here.

declare function QueryPerformanceCounter lib "Kernel32.dll" _

   alias "QueryPerformanceCounter" (lpPerformanceCount as quad) as long

function pbmain () as long

  local Interval, QTmp as quad

  local hTxt as dword

  txt.window("Demo High Res Interval Timer", 100, 100, 25, 50) to hTxt

  txt.print "Use QueryPerformanceCounter directly."

  sleep 0 'start interval count on new time slice.

  QueryPerformanceCounter Interval

  sleep 100 'a low res interval to get a count of

  QueryPerformanceCounter QTmp

  Interval = QTmp - Interval

  txt.print dec$(Interval)

  txt.print

  txt.print "Wrap QueryPerformanceCounter in FASTPROCs."

  #include "HR_Interval.inc"

  sleep 0 'start interval count on new time slice.

  HR_Interval (varptr(Interval))

  'Or VARPTR could be used for a variable before the call. Would be especially

  'useful if multiple intervals are being checked.

  sleep 100 'a low res interval to get a count of

  End_HR_Interval (varptr(Interval))

  txt.print dec$(Interval)

  txt.print

  txt.print "Any key to exit."

  txt.waitkey$

end function


Created on 13 March 2023.

To Domain Home.

home
To Dale's Notebook index.
notebook
To Programs index.
programs