欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++一种高精度计时器

程序员文章站 2022-11-27 17:45:53
在windows下可以通过QueryPerformanceFrequency()和QueryPerformanceCounter()等系列函数来实现计时器的功能。 根据其函数说明,其精度能够达到微秒级,但是需要硬件中的计时器来支持。至于具体怎么样的硬件能够支持,查了很多资料都没有详细说明;而另外一些 ......

在windows下可以通过queryperformancefrequency()和queryperformancecounter()等系列函数来实现计时器的功能。

根据其函数说明,其精度能够达到微秒级,但是需要硬件中的计时器来支持。至于具体怎么样的硬件能够支持,查了很多资料都没有详细说明;而另外一些资料也说明,如果底层硬件不支持,这两个api就会返回类似于gettickcount()的精度结果。一般情况下可以放心的使用。

这里就把自己一直用的计时器分享一下,已经简单将其封装成类的形式,大家可以将其加入到常用的工具组件里面,方便使用:

#include<iostream>
#include<windows.h>

using namespace std;

class ctimer
{
public:
    ctimer(void);
    ~ctimer(void);

    int time_in();
    double time_out();

private:
    large_integer litmp;
    longlong qt1, qt2;
    double dft, dff, dfm;
};

ctimer::ctimer(void)
{
}


ctimer::~ctimer(void)
{
}

int ctimer::time_in()
{
    queryperformancefrequency(&litmp);//获得时钟频率
    dff = (double)litmp.quadpart;

    queryperformancecounter(&litmp);//获得初始值
    qt1 = litmp.quadpart;

    return 1;
}

double ctimer::time_out()
{
    queryperformancecounter(&litmp);//获得终止值
    qt2 = litmp.quadpart;

    dfm = (double)(qt2 - qt1);
    dft = dfm / dff;//获得对应的时间值

    return dft;
}

int main()
{   
    ctimer timer;
    timer.time_in();
    for (size_t i = 0; i < 10000; i++)
    {
        const size_t num = 200 * 1024;
        char *tmp = new char[num];
        memset(tmp, 0, num);
        delete[] tmp;
        tmp = nullptr;
    }
    cout<<"申请堆耗时:"<<timer.time_out()<<endl;

    timer.time_in();
    for (size_t i = 0; i < 10000; i++)
    {
        const size_t num = 200 * 1024;
        char tmp[num];
        memset(tmp, 0, num);
    }
    cout << "申请栈耗时:" << timer.time_out() << endl;
    
    return 0;
}

这里的例子分别计算了申请堆和申请栈的时间,其运行结果如下:
C++一种高精度计时器