微秒级时间获取

2018-12-16  本文已影响0人  糖葫芦_4273

windows高精度记时方法:

这个方法调用两个函数:
记时原理:

将两个时间点的QueryPerformanceCounter相减,得到在这段时间内计时器记录的次数,有了计数次数,再乘以每次的时间(频率的倒数)就得到了总共消耗的时间了。

函数原型
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

//LARGE_INTEGER定义如下,我们只用到这个联合体的QuadPart部分
typedef union _LARGE_INTEGER {
    struct {
        ULONG LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        ULONG LowPart;
        LONG HighPart;
    } u;
    LONGLONG QuadPart;
} LARGE_INTEGER;
简单的例子
#include<windows.h>
#include<iostream>
using namespace std;

void fun()
{
    Sleep(100);//睡100毫秒
}

int main()
{
    double runtime;
    LARGE_INTEGER frequency;  //frequency,用来储存计数器的频率
    LARGE_INTEGER start;      //start用来储存开始时计数器的计数
    LARGE_INTEGER end;        //end用来储存结束时计数器的计数

    //QueryPerformanceFrequency(&frequency)把获得的计数器频率储存到frequency.QuadPart中
    //若此电脑不支持高精度计时器,则函数返回值为0
    if (QueryPerformanceFrequency(&frequency))
    {
        //把此刻的计数器次数值储存到start.QuadPart中
        QueryPerformanceCounter(&start);
        fun();
        //把此刻的计数器次数值储存到end.QuadPart中
        QueryPerformanceCounter(&end);
        //总时间=次数差/频率
        //乘1000000是为了把单位换算成微秒
        //也可以乘1000来把单位换算成毫秒
        ////但是一定要注意,一定要把*1000与(end.QuadPart - start.QuadPart)放在一起
        runtime = (end.QuadPart - start.QuadPart) * 1000 * 1000 / frequency.QuadPart;
        cout<<"调用fun()函数一共消耗了 " << runtime << " (微秒)" << endl;
    }
    else
    {
        cout << "不支持高精度计时器" << endl;
    }
    system("pause");
}
上一篇下一篇

猜你喜欢

热点阅读