Windows 各种计时函数总结

来源:互联网 发布:剑三异瞳萝莉捏脸数据 编辑:程序博客网 时间:2024/05/16 11:46
本文对Windows平台下常用的计时函数进行总结,包括精度为秒、毫秒、微秒三种精度的5种方法。分为在标准C/C++下的二种time()及clock(),标准C/C++所以使用的time()及clock()不仅可以用在Windows系统,也可以用于Linux系统。在Windows系统下三种,使用Windows提供的API接口timeGetTime()、GetTickCount()及QueryPerformanceCounter()来完成。文章最后给出了5种计时方法示例代码。

 

标准C/C++的二个计时函数time()及clock()

 

time_t time(time_t *timer);

返回以格林尼治时间(GMT)为标准,从1970年1月1日00:00:00到现在的此时此刻所经过的秒数。

time_t实际是个long长整型typedef long time_t;

头文件:#include <time.h>

 

clock_t clock(void);

返回进程启动到调用函数时所经过的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock),以毫秒为单位。

clock_t实际是个long长整型typedef long clock_t;

头文件:#include <time.h>

 

 

Windows系统API函数

timeGetTime()、GetTickCount()及QueryPerformanceCounter()

 

DWORD timeGetTime(VOID);

返回系统时间,以毫秒为单位。系统时间是从系统启动到调用函数时所经过的毫秒数。注意,这个值是32位的,会在0到2^32之间循环,约49.71天。

头文件:#include <Mmsystem.h>            

引用库:#pragma comment(lib, "Winmm.lib")  

 

DWORD WINAPI GetTickCount(void);

这个函数和timeGetTime()一样也是返回系统时间,以毫秒为单位。

头文件:直接使用#include <windows.h>就可以了。

 

高精度计时,以微秒为单位(1毫秒=1000微秒)。

先看二个函数的定义

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);

得到高精度计时器的值(如果存在这样的计时器)。

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

返回硬件支持的高精度计数器的频率(次每秒),返回0表示失败。

再看看LARGE_INTEGER

它其实是一个联合体,可以得到__int64 QuadPart;也可以分别得到低32位DWORD LowPart和高32位的值LONG HighPart。

在使用时,先使用QueryPerformanceFrequency()得到计数器的频率,再计算二次调用QueryPerformanceCounter()所得的计时器值之差,用差去除以频率就得到精确的计时了。

头文件:直接使用#include <windows.h>就可以了。

 

 

下面给出示例代码,可以在你电脑上测试下。

[cpp] view plaincopy
  1. //Windows系统下time(),clock(),timeGetTime(),GetTickCount(),QueryPerformanceCounter()来计时 by MoreWindows  
  2. #include <stdio.h>  
  3. #include <windows.h>  
  4. #include <time.h> //time_t time()  clock_t clock()  
  5. #include <Mmsystem.h>             //timeGetTime()  
  6. #pragma comment(lib, "Winmm.lib")   //timeGetTime()  
  7.   
  8. int main()  
  9. {  
  10.     //用time()来计时  秒  
  11.     time_t timeBegin, timeEnd;  
  12.     timeBegin = time(NULL);  
  13.     Sleep(1000);  
  14.     timeEnd = time(NULL);  
  15.     printf("%d\n", timeEnd - timeBegin);  
  16.       
  17.       
  18.     //用clock()来计时  毫秒  
  19.     clock_t  clockBegin, clockEnd;  
  20.     clockBegin = clock();  
  21.     Sleep(800);  
  22.     clockEnd = clock();  
  23.     printf("%d\n", clockEnd - clockBegin);  
  24.       
  25.       
  26.     //用timeGetTime()来计时  毫秒  
  27.     DWORD  dwBegin, dwEnd;  
  28.     dwBegin = timeGetTime();  
  29.     Sleep(800);  
  30.     dwEnd = timeGetTime();  
  31.     printf("%d\n", dwEnd - dwBegin);  
  32.       
  33.       
  34.     //用GetTickCount()来计时  毫秒  
  35.     DWORD  dwGTCBegin, dwGTCEnd;  
  36.     dwGTCBegin = GetTickCount();  
  37.     Sleep(800);  
  38.     dwGTCEnd = GetTickCount();  
  39.     printf("%d\n", dwGTCEnd - dwGTCBegin);  
  40.       
  41.       
  42.     //用QueryPerformanceCounter()来计时  微秒  
  43.     LARGE_INTEGER  large_interger;  
  44.     double dff;  
  45.     __int64  c1, c2;  
  46.     QueryPerformanceFrequency(&large_interger);  
  47.     dff = large_interger.QuadPart;  
  48.     QueryPerformanceCounter(&large_interger);  
  49.     c1 = large_interger.QuadPart;  
  50.     Sleep(800);  
  51.     QueryPerformanceCounter(&large_interger);  
  52.     c2 = large_interger.QuadPart;  
  53.     printf("本机高精度计时器频率%lf\n", dff);  
  54.     printf("第一次计时器值%I64d 第二次计时器值%I64d 计时器差%I64d\n", c1, c2, c2 - c1);  
  55.     printf("计时%lf毫秒\n", (c2 - c1) * 1000 / dff);  
  56.       
  57.     printf("By MoreWindows\n");  
  58.     return 0;  
  59. }  


下面是本人电脑上的测试结果:

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩头部摔到地上想吐头晕怎么办 肺部化疗恶心反胃怎么办吃什么药好 好久没运动一运动全身酸痛怎么办 怀孕两个月了一直吐没体力怎么办 公务员审查六级口语证丢了怎么办 农资经营如果被执法查处了怎么办? 干隧道测量坚持不下去该怎么办 老家房子强拆没钱做没钱补怎么办? 魔兽世界出了两个一样的传说怎么办 死亡事故后遇上不讲理家属怎么办 死亡事故后死亡者家属不讲理怎么办 住的地方治安乱混混多怎么办 使命召唤进去感觉动作好慢怎么办 40岁后不够硬不持久怎么办 如果别人毁灭了你的梦想怎么办 如果死者托梦说自己过的不好怎么办 吵架了老婆跑回娘家不回家了怎么办 和老婆吵架她跑回娘家了怎么办 鞋子里面的皮穿的都是泥怎么办 绝地求生手游模拟器键位不灵怎么办 我更新目录的时候目录不存在怎么办 如果别人欠我钱不还 我该怎么办 老婆欠信用卡的钱我该怎么办 我欠了很多钱我该怎么办 一个人欠我钱跑了我该怎么办 买房子时间长了成危楼了怎么办 别人欠我钱人找不到了怎么办 欠银行信用卡钱人失踪了怎么办 欧洲卡车模拟2没油了怎么办 蓝牙安装包里没有微信怎么办 腾讯手游模拟器玩全军出击卡怎么办 手游cf用模拟器画面很抖怎么办 腾讯手游助手模拟器游戏卡死怎么办 腾讯手游模拟器提示注册以满怎么办 手游绝地求生被检测成模拟器怎么办 腾讯手游助手模拟器内存不够怎么办 微信视频对方听不到我的声音怎么办 学生考试传纸条作弊老师应怎么办 苹果手机微信小游戏没有声音怎么办 红米手机游戏下好了安装不了怎么办 小米手机sd卡存储已满怎么办