在我们调试代码的时候,很多时候需要用代码的运行时间来衡量代码的效率,看了网上已经有了很多关于计时的文章,自己学习的时候再进行一些整理吧。

1. time()函数 

  在头文件time.h中,time()获取当前的系统时间,只能精确到秒,返回的结果是一个time_t类型,其使用方法如下:

#include <time.h>#include<stdio.h>   intmain() {  time_t first, second;  first=time(NULL);  delay(2000);  second=time(NULL);  printf("The difference is: %f seconds",difftime(second,first));  //调用difftime求出时间差return 0;
}

2. clock()函数

  在头文件time.h中,clock()函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock),常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,精确到毫秒,其使用方法如下:

#include<time.h>#include<stdio.h>intmain()
{doubledur;clock_t start,end;start=clock();foo();//dosomethingend =clock();dur= (double)(end -start);printf("Use Time:%f\n",(dur/CLOCKS_PER_SEC));
}

3.timeGetTime()函数(Windows API

  以毫秒计的系统时间,该时间为从系统开启算起所经过的时间。在使用timeGetTime之前应先包含头文件#include <Mmsystem.h>或#include <Windows.h>并在project->settings->link->Object/library modules中添加winmm.lib。也可以在文件头部添加 #pragma comment( lib,"winmm.lib" )。

备注:命令行:#pragma comment( lib,"xxx.lib" )时预编译处理指令,让vc将winmm.lib添加到工程中去进行编译。

#include<stdio.h>#include<windows.h>#pragma comment( lib,"winmm.lib" )intmain()
{DWORD t1, t2;t1=timeGetTime();foo();//do somethingt2 =timeGetTime();printf("Use Time:%f\n", (t2 - t1)*1.0 / 1000);return 0;
}

   该函数的时间精度是五毫秒或更大一些,这取决于机器的性能。可用timeBeginPeriod和timeEndPeriod函数提高timeGetTime函数的精度。如果使用了,连续调用timeGetTime函数,一系列返回值的差异由timeBeginPeriod和timeEndPeriod决定。也可以用timeGetTime实现延时功能Delay

voidDelay(DWORD delayTime)
{DWORD delayTimeBegin;DWORD delayTimeEnd;delayTimeBegin=timeGetTime();do{    delayTimeEnd=timeGetTime();}while((delayTimeEnd-delayTimeBegin)<delayTime)
}

 

4.QueryPerformanceCounter()函数和QueryPerformanceFrequency()函数(Windows API)

  QueryPerformanceFrequency()函数返回高精确度性能计数器的值,它可以以微妙为单位计时,但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率。QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数。

#include<stdio.h>#include<windows.h>
#pragma comment( lib,"winmm.lib" )intmain()
{LARGE_INTEGER t1, t2, tc;QueryPerformanceFrequency(&tc);QueryPerformanceCounter(&t1);foo();//do somethingQueryPerformanceCounter(&t2);printf("Use Time:%f\n", (t2.QuadPart - t1.QuadPart)*1.0 /tc.QuadPart);return 0;
}

5.GetTickCount()函数(Windows API)

  GetTickCount返回(retrieve)从操作系统启动所经过(elapsed)的毫秒数,它的返回值是DWORD。

#include<stdio.h>#include<windows.h>
#pragma comment( lib,"winmm.lib" )intmain()
{DWORD t1, t2;t1=GetTickCount();foo;//do somethingt2 =GetTickCount();printf("Use Time:%f\n", (t2 - t1)*1.0 / 1000);return 0;
}

6.RDTSC指令(Windows)

  在Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。这个精确性是上述几种方法所无法比拟的.在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31。

inline unsigned __int64 GetCycleCount()
{__asm{_emit0x0F;_emit0x31;}
}voidtest6()
{unsignedlongt1,t2;t1= (unsigned long)GetCycleCount();foo();//dosomethingt2 = (unsigned long)GetCycleCount();printf("Use Time:%f\n",(t2 - t1)*1.0/FREQUENCY);   //FREQUENCY指CPU的频率
}

获取CPU频率参考:http://blog.csdn.net/kofandlizi/article/details/6253801

7.gettimeofday() (Linux)

//timeval结构定义为:
structtimeval{long tv_sec; /**/long tv_usec; /*微秒*/};//timezone 结构定义为:
structtimezone{int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/int tz_dsttime; /*日光节约时间的状态*/};voidtest()
{structtimeval t1,t2;doubletimeuse;gettimeofday(&t1,NULL);foo();gettimeofday(&t2,NULL);timeuse= t2.tv_sec - t1.tv_sec + (t2.tv_usec - t1.tv_usec)/1000000.0;printf("Use Time:%f\n",timeuse);
}

8.RDTSC指令计时(Linux)

#if defined (__i386__)
static __inline__ unsigned long long GetCycleCount(void)
{unsignedlong long intx;__asm__volatile("rdtsc":"=A"(x));returnx;
}#elif defined (__x86_64__)
static __inline__ unsigned long long GetCycleCount(void)
{unsigned hi,lo;__asm__volatile("rdtsc":"=a"(lo),"=d"(hi));return ((unsigned long long)lo)|(((unsigned long long)hi)<<32);
}#endifvoidtest8()
{unsignedlongt1,t2;t1= (unsigned long)GetCycleCount();foo();//dosomethingt2 = (unsigned long)GetCycleCount();printf("Use Time:%f\n",(t2 - t1)*1.0/FREQUENCY); //FREQUENCY  CPU的频率
}

9.GetSystemTime / GetLocalTime(Windows)

  Windows SDK 中有两个精确到毫秒的获取当前时间的函数:

    GetSystemTime:获取 UTC 时间。

    GetLocalTime:获取当地时间。

  这两个函数的返回都是:SYSTEMTIME ,结构体占用了 16 个字节,它的定义如下:

typedef struct_SYSTEMTIME {WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds;
} SYSTEMTIME,*PSYSTEMTIME;

//GetSystemTime.cpp : Defines the entry point for the console application.#include"stdafx.h"#include<Windows.h>int _tmain(void)
{SYSTEMTIME utc_time= { 0};SYSTEMTIME local_time= { 0};GetSystemTime(&utc_time);GetLocalTime(&local_time);_tprintf(_T("The UTC time is \t: %02d:%02d:%02d.%03d\n"), utc_time.wHour, utc_time.wMinute, utc_time.wSecond, utc_time.wMilliseconds);_tprintf(_T("The local time is\t: %02d:%02d:%02d.%03d\n"), local_time.wHour, local_time.wMinute, local_time.wSecond, local_time.wMilliseconds);return 0;
}


10.GetSystemTimeAsFileTime

  究竟能不能达到 100 纳秒的精确度呢?在 Windows SDK 中有一个结构体:FILETIME,它可以记录精度达到 100ns 的时间。用哪个函数得到这个值呢?可以用 GetSystemTimeAsFileTime。但是,不要高兴得太早,虽

然 FILETIME 能够达到如此高的精度,但是这个函数我连试都懒得试。为什么呢?因为 Windows 系统并不是一个实时操作系统(Windows Embedded Compact 2013 是一个实时系统),其时钟精度一般认为是 15 ~ 16 毫秒。

Windows Sysinternals 给我们提供了一个查看你使用的 Windows 系统的时钟分辨率的小工具:ClockRes v2.0。把它下载下来在控制台中执行,结果如下:

看到了吧。死心了吧。所以说,用 GetSystemTime / GetLocalTime 就已经很好了。如果要获得真正毫秒级甚至更高精度的当前系统时间,必须跟 CPU 打交道,别无它法。先贴出代码吧:

#ifdef _WIN32
#include<windows.h>
#else#include<time.h>
#endif  //_WIND32//定义64位整形
#if defined(_WIN32) && !defined(CYGWIN)typedef __int64 int64_t;#elsetypedeflong longint64t;#endif  //_WIN32//获取系统的当前时间,单位微秒(us)
int64_t GetSysTimeMicros()
{
#ifdef _WIN32//从1601年1月1日0:0:0:000到1970年1月1日0:0:0:000的时间(单位100ns)
#define EPOCHFILETIME   (116444736000000000UL)FILETIME ft;LARGE_INTEGER li;int64_t tt= 0;GetSystemTimeAsFileTime(&ft);li.LowPart=ft.dwLowDateTime;li.HighPart=ft.dwHighDateTime;//从1970年1月1日0:0:0:000到现在的微秒数(UTC时间)tt = (li.QuadPart - EPOCHFILETIME) /10;returntt;#elsetimeval tv;gettimeofday(&tv, 0);return (int64_t)tv.tv_sec * 1000000 +(int64_t)tv.tv_usec;#endif //_WIN32return 0;
}

参考资料:http://blog.csdn.net/luoweifu/article/details/51325432

http://blog.csdn.net/yapingxin/article/details/49466223

http://www.cnblogs.com/leven20061001/archive/2012/11/08/2760126.html

转载于:https://www.cnblogs.com/chmm/p/7461684.html

C和C++中的计时器相关推荐

  1. python中time的用法_python中的计时器timeit的使用方法

    本文介绍了python中的计时器timeit的使用方法,分享给大家,具体如下: timeit 通常在一段程序的前后都用上time.time(),然后进行相减就可以得到一段程序的运行时间,不过pytho ...

  2. python程序运行时间计时软件_python中的计时器timeit的使用方法

    这篇文章主要介绍了关于python中的计时器timeit的使用方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 本文介绍了python中的计时器timeit的使用方法,分享给大家,具 ...

  3. [转载]C#中各种计时器

    1.使用 Stopwatch 类 (System.Diagnostics.Stopwatch) Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.在典型的 S ...

  4. python计时器timeit返回秒数_python中的计时器timeit的使用方法

    本文介绍了python中的计时器timeit的使用方法,分享给大家,具体如下: timeit 通常在一段程序的前后都用上time.time(),然后进行相减就可以得到一段程序的运行时间,不过pytho ...

  5. java中GUI中显示当前时间_javaGUI界面实现动态时间显示——Swing中的计时器Timer

    在Java中要实现时间的动态显示有不少种方法.下面就介绍其中一种简单的方法给你们.java Swing中的计时器Timer,主要用到javax.swing.*包下的Timer类,该类能够周期的触发Ac ...

  6. python中time模块中的倒计时_python中的计时器timeit的使用方法

    Python3该怎么学,完全不懂,新手小白下周就要考试Python3该怎么学,完全不懂,新手小白下周就要考试了.只对D语言和机器python语言很简单的,不知你们是什么考试,如果是普通考试. pyth ...

  7. python time计时_python中的计时器timeit的使用方法

    这篇文章主要介绍了关于python中的计时器timeit的使用方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 本文介绍了python中的计时器timeit的使用方法,分享给大家,具 ...

  8. python timeit用法_python中的计时器timeit的使用方法

    本文介绍了python中的计时器timeit的使用方法,分享给大家,具体如下: timeit 通常在一段程序的前后都用上time.time(),然后进行相减就可以得到一段程序的运行时间,不过pytho ...

  9. C#中各种计时器 Stopwatch、TimeSpan

    1.使用 Stopwatch 类 (System.Diagnostics.Stopwatch) Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间. 在典型的 ...

  10. C#中实现计时器功能(定时任务和计时多长时间后执行某方法)

    场景 在低液位预警弹窗点击确定后需要实现一个计时器,比如在五分钟后再执行监控. 实现思路是使用Timer然后每秒执行一个方法,在方法中对秒数进行减1操作,等倒计时结束后执行相应的操作. 注: 博客主页 ...

最新文章

  1. 《代码大全2》读后感czz
  2. tableau应用实战案例(五十)-销售业绩的tableau可视化案例
  3. [转载] Python3中的表达式运算符
  4. QQ浏览器如何修改截屏快捷键?QQ浏览器修改截屏快捷键的方法
  5. UI设计APP素材可编辑模板|底部标签式导航
  6. 理解storm的ACKER机制原理
  7. 修改Python解释器和包路径
  8. go日志收集系统项目简介
  9. Pyts入门之时间序列的分解---奇异谱分析(七)
  10. 戴尔笔记本win10系统迁移到新固态硬盘
  11. redis hset hget字典的实现
  12. USB数据采集卡:labjack T7、T7 Pro系列的技术特点
  13. 如何准确获取地点位置的经纬度?
  14. 【YOLOV5-5.x 源码解读】plots.py
  15. awesome-git 中文版,收集常用 Git 教程、工具 の 资源库
  16. ibatis中resultMap和resultClass的区别 以及parameterClass 的取值
  17. libxml2生成,解析,修改xml文件,以及使用实例
  18. 文件服务器审计---首选Netwrix文件服务器审计工具
  19. c++语言基础教程第三版习题答案,《C++语言基础教程》吕凤翥习题答案
  20. 35岁后,不是你被淘汰,而是你没有发现你的价值 | 如何发现35岁后的价值?

热门文章

  1. 如何在 Mac 中更改文件夹图标,换上喜欢的图像 Icon?
  2. 如何防止 Safari 使用来自 iOS 15 和 macOS Monterey 的网站着色?
  3. 数据库管理软件SQLPro for SQLite for Mac 2022.30
  4. 寒冬已至,传统零售业如何打破僵局“逆境生长”
  5. 看雪CTF.TSRC 2018 团队赛 第九题『谍战』 解题思路
  6. 0028-如何在CDH未启用认证的情况下安装及使用Sentry
  7. HTTP协议——学习资料小结
  8. 正则表达式替换字符串
  9. Cisco公司的CAR流量控制策略
  10. 详解display:inline | block |inline-block的区别(转)