关闭

通过系统API函数实现精确记时

标签: Delphi
467人阅读 评论(0) 收藏 举报
分类:

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

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31039次
    • 积分:583
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:0篇
    • 译文:0篇
    • 评论:9条
    最新评论