var C1, T1,T2:int64;
R1,R2,R3:double;
begin
QueryPerformanceFrequency(c1); // WINDOWS API 返回计数频率(获得系统的高性能频率计数器在一毫秒内的震动次数)
QueryPerformanceCounter(t1); // WINDOWS API 获取开始计数值
sleep(1111); // 需要计时的程序代码
QueryPerformanceCounter(t2); // 获取结束计数值
R1:=(T2-T1)/C1; // 取得计时时间,单位秒(s)
R2:=(T2-T1)/C1*1000; // 取得计时时间,单位毫秒 (ms)
R3:=(T2-T1)/C1*1000000; // 取得计时时间,单位微秒
Memo1.Lines.Add(Floattostr(R1)+'秒');
Memo1.Lines.Add(Floattostr(R2)+'毫秒');
Memo1.Lines.Add(Floattostr(R3)+'微秒');
end;
原理:利用Windows API函数实现精确记时的方法。
1、QueryPerformanceFrequency
QueryPerformanceFrequency函数获得高性能频率记数器的震荡频率。调用该函数后,函数会将系统频率记数器的震荡频率(每毫秒)保存到一个LargeInteger中。
2、QueryPerformanceCounter。
QueryPerformanceCounter函数获得系统频率记数器的震荡次数,结果也保存到一个Largenteger中。
这样,就可以计算出二个时段,之间的差距了。
1、首先使用QueryPerformanceFrequency获得高性能频率记数器每毫秒的震荡次数,
2、然后在计时开始时使用QueryPerformanceCounter函数获得当前系统频率记数器的震荡次数。
3、在计时结束时再调用QueryPerformanceCounter函数获得系统频率记数器的震荡次数。
将两者相减,再将结果除以频率记数器每毫秒的震荡次数,就可以获得某一事件经过的准确时间。(次数除以频率等于时间)
结果:
1.11026877822618 秒
1110.26877822618 毫秒
1110268.77822618 微秒