C++一种高精度计时器
程序员文章站
2022-05-21 17:40:42
在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; }
这里的例子分别计算了申请堆和申请栈的时间,其运行结果如下: