>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 >