VC下毫秒级定时器、测量时间的获取、LARGE_INTEGER使用

来源:互联网 发布:刷论坛推广软件 编辑:程序博客网 时间:2024/05/21 22:51

在VC中,使用自带的 SetTimer 函数的定时器精度不高,包括  GetTIckCount 获取滴答数(理论上说只有55ms的精度);还有 Sleep 函数,精度都不是很高,达不到毫秒级的测量;

可以使用多媒体下的定时器函数:

#include <windows.h>#include <stdio.h>#include <Mmsystem.h>//声明的头文件//链接多媒体lib库#pragma comment(lib, "Winmm.lib")void main(){timeBeginPeriod(1);//设置1毫秒的测量精度Sleep(100);int j=0;//多次测量for(int i=0; i<10; i++){DWORD s = timeGetTime();//开始时间(毫秒级)//测量1:Sleep延时函数的精度for (j=0; j<100; j++)Sleep(1);//测量2:for循环千万级延时//for (j=0; j<10000000; j++);//测算34~40毫秒,所以for循环每条指令为3~4个nsDWORD e = timeGetTime();//结束时间(毫秒级)//显示测量时间printf("%d\n", e-s);//}}

再来一个用QueryPerformanceFrequency类的函数测量延时的程序,这些函数在当前CPU上支持,比上面的多媒体更好用一些:

LARGE_INTEGER litmp;LONGLONG qt1,qt2;double dft,dff,dfm;//获得时钟频率QueryPerformanceFrequency(&litmp);//获得时钟频率dff=(double)litmp.QuadPart;//获得初始值QueryPerformanceCounter(&litmp);qt1=litmp.QuadPart;//下面一些耗时的操作Sleep(100);//获得终止值QueryPerformanceCounter(&litmp);qt2=litmp.QuadPart;//获得对应的时间值,转到毫秒单位上dfm=(double)(qt2-qt1);dft=dfm/dff;printf("用时: %.3f 毫秒\n", dft*1000.0);


上面的测量在工程中非常使用,基本可以在windows平台下测试一些使用时间的情况,比如用套接字发送一个大数据块、显示一个位图等等!对每个应用的程序段时间消耗都清楚,才能写出高质量的程序!

原创粉丝点击