64,639
社区成员
发帖
与我相关
我的任务
分享
;运算公式:(X2-X1)*1000000/Y (微秒)
;2010.6.14
.386
.model flat,stdcall
option casemap:none
;##################################################################
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;##################################################################
.data
dqTickCounter1 dq ?;时间点1的计数值
dqTickCounter2 dq ?;时间点2的计数值
dqFreq dq ?;计数精度
dqTime dq ?;时间间隔
dwlm dd 1000000;常数
sztip db '计时输出',0
format db 'sleep(1000)计时:%d微秒',0
.data?
buff db 128 dup(?)
;##################################################################
.code
start:
invoke QueryPerformanceCounter,addr dqTickCounter1;时间点1
invoke Sleep,1000
invoke QueryPerformanceCounter,addr dqTickCounter2;时间点2
invoke QueryPerformanceFrequency,addr dqFreq;一秒钟的计数
mov eax,dword ptr dqTickCounter1
mov edx,dword ptr dqTickCounter1 + 4
sub dword ptr dqTickCounter2,eax
sbb dword ptr dqTickCounter2 + 4,edx
finit
fild dqFreq
fild dqTickCounter2
fimul dwlm;乘以1000000
fdivr
fistp dqTime;dqTime中的64位值就是时间间隔(以微秒为单位)
invoke wsprintf,addr buff,addr format,dqTime
invoke MessageBox,NULL,addr buff,addr sztip,MB_OK
invoke ExitProcess,NULL
end start
/****
测试代码运行时间
*/
#include <stdio.h>
#include <windows.h>
class Timer
{
private:
_LARGE_INTEGER TimeStart;
_LARGE_INTEGER TimeEnd;
public:
Start() {
QueryPerformanceCounter(×tart); //计时开始
}
End() {
QueryPerformanceCounter(&TimeEnd); //计时结束
}
double Time(); //返回时差
};
double Timer::Time()
{
static double Freq;//计时器频率
static getfreq(0);
if (!getfreq) { //获得计时器频率,只运行一次
LARGE_INTEGER f;
if (QueryPerformanceFrequency(&f))
Freq=f.QuadPart;
else throw "无法获得定时器频率";
getfreq=1;
}
return (TimeEnd.QuadPart-TimeStart.QuadPart)/Freq;
}
/////////////////////////////////////////////////////////
void main()
{
Timer t;
t.Start();
Sleep(1000);//测试sleep(1000)的精确值
t.End();
printf("%f\n", t.Time());
}