CLEAR FOR i = 1 TO 10000000 *!* Burn in ENDFOR SET DECIMALS TO 18 && maximum number of places********* USING SECONDS() ************** LOCAL lcBuffer1, lcBuffer2, lnTicksPerSecond, lnCurrentTickCount DECLARE INTEGER QueryPerformanceFrequency IN kernel32 STRING @lpFrequency DECLARE INTEGER QueryPerformanceCounter IN kernel32 STRING @lpPerformanceCount lcBuffer1 = SPACE(8) lcBuffer2 = SPACE(8) =QueryPerformanceFrequency(@lcBuffer1) lnTicksPerSecond = buf2num(SUBSTR(lcBuffer1, 1,4)) + buf2num(SUBSTR(lcBuffer1, 5,4)) * 2^32 DIMENSION testN(10000,2) FOR I=1 TO ALEN(testN,1) =QueryPerformanceCounter(@m.lcBuffer1 ) =QueryPerformanceCounter(@m.lcBuffer2 ) testN(m.i,1) = m.lcBuffer1 testN(m.i,2) = m.lcBuffer2 NEXT CREATE CURSOR latency (start Q(8),stop Q(8)) APPEND FROM ARRAY testN SELECT ((buf2num(SUBSTR(stop, 1,4)) - buf2num(SUBSTR(start , 1,4))); + (buf2num(SUBSTR(stop, 5,4)) - buf2num(SUBSTR(start, 5,4))) * 2^32) callTime; FROM latency INTO CURSOR latency ORDER BY 1 BROWSE NOWAIT CALCULATE AVG(callTime),STD(callTime),MAX(callTime),MIN(callTime) TO average,SDev,MaxDev,MinDev ? "HR Performance counter accurate to 1/" + TRANSFORM(lnTicksPerSecond) + " of a second" ? "Latency Accurate: " ,round(average,0) ? " St. Deviation " ,round(SDev,0) ? " Max deviation" ,round(MAX(MaxDev-average,average-MinDev),0) ? "Then the precision is 1/" + TRANSFORM( ROUND(lnTicksPerSecond/SDev,0)) ************************ FUNCTION buf2num(tcBuffer) ************************ RETURN ASC(SUBSTR(tcBuffer, 1,1)) + ; ASC(SUBSTR(tcBuffer, 2,1)) * 2^8 + ; ASC(SUBSTR(tcBuffer, 3,1)) * 2^16 + ; ASC(SUBSTR(tcBuffer, 4,1)) * 2^24