Windows平台下,常用的计时器有两种:
1, TimeGetTime计时器,它可以提供毫秒级ms的计时。但这个精度对很多应用场合而言还是不够精确的。
例子:
#include <windows.h> #include <stdio.h> #pragma comment(lib, "winmm")//告诉程序要链接winmm.lib,VC中路径:VC98-->lib-->winmm.lib main() { DWORD t1, t2; t1 = timeGetTime(); Sleep(50); t2 = timeGetTime(); printf("Start Time: %uμs\n", 1000*t1); printf("End Time: %uμs\n", 1000*t2); printf("Lasting Time: %uμs\n",(1000*t2-1000*t1)); }
2,QueryPerformanceCount计数器
此计数器随系统的不同可以提供微秒级μs的计数,如果硬件里有定时器,它就会启动这个定时器,并且不断获取定时器。
这样的定时器精度,就跟硬件时钟的晶振一样精确的。当需要更高精度计时时就需要使用QUeryPerformanceCounter来查询定时器的计数值。对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,
善用QueryPerformanceCount/QueryPerformanceFrequency是一项基本功。
//Timer2.cpp 使用QueryPerformanceCounter函数(查询定时器的计数值,其时间跟频率有关,例如Frequency为25000000,则每计数一次消耗0.04μs)
//编译行:CL timer3.cpp /link KERNEl32.lib #include <windows.h> #include <stdio.h> main() { LARGE_INTEGER t1, t2, tf; QueryPerformanceFrequency(&tf); printf("Frequency: %u\n", tf.QuadPart); QueryPerformanceCounter(&t1); Sleep(50); QueryPerformanceCounter(&t2); printf("Start Time: %u\n", 1000000*t1.QuadPart); printf("End Time: %u\n", 1000000*t2.QuadPart); printf("Lasting Time: %uμs\n",(1000000*t2.QuadPart-1000000*t1.QuadPart)/tf.QuadPart); } /////////////////////////////////执行结果////////////////////////////////// Frequency: 25000000 Frequency: 25000000 ①Start Time: 401052736 ②Start Time: 3144881664 End Time: 2553536896 End Time: 3878562048 Lasting Time: 49907 μs Lasting Time: 50881 μs //////////////////////////////////////////////////////////////////////////// 可见,TimeGetTime函数的精确度是到ms,一旦到达μs级位数则为零,而QueryPerformanceCounter函数则可精确到μs级。