本文对Windows及Linux平台下常用的计时函数进行总结,包括精度为秒、毫秒、微秒三种精度的各种函数。
比如Window平台下特有的Windows API函数GetTickCount()、timeGetTime()、及QueryPerformanceCounter(),
Linux平台下特有的gettimeofday()函数,以及标准的C/C++函数time()和clock()。下面分别对此进行简单介绍并附上示例代码。

通用的C/C++计时函数time()和clock()

time_t time(time_t *timer);
返回以格林尼治时间(GMT)为标准,从1970年1月1日00:00:00到现在的此时此刻所经过的秒数。
time_t实际是个long长整型typedef long time_t;

clock_t clock(void);
返回进程启动到调用函数时所经过的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock),以毫秒为单位。
clock_t实际是个long长整型typedef long clock_t;

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

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

高精度计时,以微秒为单位(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()所得的计时器值之差,
用差去除以频率就得到精确的计时了。

Linux平台特有函数
int gettimeofday(struct timeval *tv,struct timezone *tz);
获得当前精确时间(1970年1月1日到现在的时间),精度为微秒。
保存时间的结构体
strut timeval {
long tv_sec; //秒数
long tv_usec; //微秒数
};

附上代码

  1. #include <iostream>
  2.  
  3. #if defined(_WIN32) || defined(WIN32) /**Windows*/
  4. #define WINDOWS_IMPL
  5. #include <windows.h>
  6. #include <time.h> //time() 、 clock()
  7. #include <Mmsystem.h> //timeGetTime()
  8. #pragma comment(lib, "Winmm.lib") //timeGetTime()
  9. #elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(BSD) /**Linux*/
  10. #define LINUX_IMPL
  11. #include <sys/time.h> //gettimeofday()
  12. #endif
  13. #include <stdio.h>
  14.  
  15. /***********************************************************
  16. 通用的:
  17. time_t time(time_t *tloc); //返回从1970年1月1日0点以来的秒数,精度为秒
  18. clock_t clock(): 返回该程序从启动到函数调用占用CPU的时间,精度为毫秒,但一般最小精度是33ms
  19.  
  20. Windows特有:
  21. GetTickCount(): 返回从操作系统启动到现在所经过的毫秒数,精度毫秒,但最小精度是18ms
  22. 返回值以32位的双字类型DWORD存储,因此可以存储的最大值是2^32 ms约为49.71天,
  23. timeGetTime(): 返回以毫秒计的系统时间,该时间为从系统开启算起所经过的时间,精度为毫秒
  24. QueryPerformanceCounter(): 返回高精确度性能计数器的值,精度为微妙,但是确切的精确计时的最小单位是与系统有关的
  25.  
  26. Linux特有:
  27. gettimeofday(struct timeval *tv,struct timezone *tz); 获得当前精确时间(1970年1月1日到现在的时间),精度为微秒
  28. ***********************************************************/
  29.  
  30. void MySleep(int sec_time)
  31. {
  32. #if defined(WINDOWS_IMPL)
  33. Sleep(sec_time*);
  34. #elif defined(LINUX_IMPL)
  35. sleep(sec_time);
  36. #endif
  37. }
  38.  
  39. void test_time()
  40. {
  41. //通用的
  42. //用time()来计时 秒
  43. time_t timeBegin, timeEnd;
  44. timeBegin = time(NULL);
  45. MySleep();
  46. timeEnd = time(NULL);
  47. printf("%d\n", timeEnd - timeBegin);
  48.  
  49. /*
  50. * Structure used in select() call, taken from the BSD file sys/time.h.
  51. */
  52. //struct timeval {
  53. // long tv_sec; /* seconds */
  54. // long tv_usec; /* and microseconds */
  55. //};
  56. timeval val;
  57.  
  58. //用clock()来计时 毫秒
  59. clock_t clockBegin, clockEnd;
  60. clockBegin = clock();
  61. MySleep();
  62. clockEnd = clock();
  63. printf("%d\n", clockEnd - clockBegin);
  64.  
  65. #ifdef WINDOWS_IMPL
  66. //Windows
  67.  
  68. //用GetTickCount()来计时 毫秒
  69. DWORD dwGTCBegin, dwGTCEnd;
  70. dwGTCBegin = GetTickCount();
  71. Sleep();
  72. dwGTCEnd = GetTickCount();
  73. printf("%d\n", dwGTCEnd - dwGTCBegin);
  74.  
  75. //用timeGetTime()来计时 毫秒
  76. DWORD dwBegin, dwEnd;
  77. dwBegin = timeGetTime();
  78. Sleep();
  79. dwEnd = timeGetTime();
  80. printf("%d\n", dwEnd - dwBegin);
  81.  
  82. //用QueryPerformanceCounter()来计时 微秒
  83. LARGE_INTEGER large_interger;
  84. double dff;
  85. __int64 c1, c2;
  86. QueryPerformanceFrequency(&large_interger);
  87. dff = large_interger.QuadPart;
  88. QueryPerformanceCounter(&large_interger);
  89. c1 = large_interger.QuadPart;
  90. Sleep();
  91. QueryPerformanceCounter(&large_interger);
  92. c2 = large_interger.QuadPart;
  93. printf("高精度计时器频率%lf\n", dff);
  94. printf("第一次计时器值%I64d 第二次计时器值%I64d 计时器差%I64d\n", c1, c2, c2 - c1);
  95. printf("计时%lf毫秒\n", (c2 - c1) * / dff);
  96.  
  97. #elif defined(LINUX_IMPL)
  98. //Linux
  99.  
  100. struct timeval tpstart,tpend;
  101. double timeuse;
  102. gettimeofday(&tpstart,NULL);
  103. sleep();
  104. gettimeofday(&tpend,NULL);
  105. timeuse=*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;//注意,秒的读数和微秒的读数都应计算在内
  106. printf("used time:%fus\n",timeuse);
  107. #endif
  108.  
  109. }
  110.  
  111. int main()
  112. {
  113. test_time();
  114. getchar();
  115. return ;
  116. }

在Windows平台下运行结果如下:

在Linux平台下运行结果如下:

Windows及Linux平台下的计时函数总结的更多相关文章

  1. Thrift在Windows及Linux平台下的安装和使用示例

    本文章也同时发表在个人博客Thrift在Windows及Linux平台下的安装和使用示例上. thrift介绍 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的R ...

  2. Perl Tk在IC设计中的应用、Windows、Linux平台下的安装-各种错误的摸索解决

    本文转自:自己的微信公众号<集成电路设计及EDA教程> <Perl Tk在IC设计中的应用.Windows.Linux平台下的安装-各种错误的摸索解决> Perl在IC设计中有 ...

  3. Windows 和 Linux 平台下的端口转发工具

    原文地址: http://unmi.cc/windows-linux-port-forwarding/ 这里记录一下我曾经使用过的几个端口转发工具,即端口映射.端口重定向,和 NAT 也是差不多的概念 ...

  4. AES加密在windows与linux平台下显示结果不同,解决方案

    现象描述: 在 windows 操作系统下加解密正常,但部署到 linux 环境中相同的输入加密结果不正确,并且每次运行返回的结果都不同.也就是说在windows下加解密都正常,一但部署到linux下 ...

  5. windows和linux平台下的通用时间测试函数

    Time.cpp ////////////////////////////////////////////////////////////////////////////// // Timer.cpp ...

  6. socklen_t在windows和linux平台下的头文件定义

    windows平台下:头文件:#include<ws2tcpip.h> linux平台下:下面两个头文件都有定义:1)#include <sys/socket.h>2)#inc ...

  7. [转]Windows与Linux系统下的库文件介绍

    什么是库   库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的.它们通常由一组互相关联的用来完成某项常见工作的函数构成,从本质上来说库是一种可执行代码的二进制形式,可以被操作系 ...

  8. 【Linux技术】Windows与Linux系统下的库·初探

    库的定义  库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的.它们通常由一组互相关联的用来完成某项常见工作的函数构成,从本质上来说库是一种可执行代码的二进制形式,可以被操作系统 ...

  9. 转载~Linux 平台下阅读源码的工具

    Linux 平台下阅读源码的工具 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码在Windows下有sourceinsight这 ...

随机推荐

  1. Log4j2常见使用示例及Syslog/Syslog-ng

    准备工作 打开http://logging.apache.org/log4j/,点击左侧Download,我下载的是Apache Log4j 2 binary (zip),目前是2.0.2版本.解压后 ...

  2. 关于H.264 x264 h264 AVC1

    1. H.264是MPEG4的第十部分,是一个标准.对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC. 2.x264是一个编码器, ...

  3. android获取本机的IP地址和mac物理地址

    /获取本机IP地址 public String getLocalIpAddress() { WifiManager wifiManager = (WifiManager) getSystemServi ...

  4. Ubuntu server解决不能访问外网问题

    Ubuntu server解决不能访问外网问题 在Ubuntu Server上设置访问外网时,需要设置dns,通常是将dns添加到/etc/resolv.conf文件中. 但是将dns添加至/etc/ ...

  5. centos7 linux 安装jdk8

    1.下载64位jdk8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.在 ...

  6. LCLFramework框架之Repository模式

    Respository模式在示例中的实际目的小结一下 Repository模式是架构模式,在设计架构时,才有参考价值: Repository模式主要是封装数据查询和存储逻辑: Repository模式 ...

  7. HL AsySocket 服务开发框架 - 总体思路与架构

    一 背景 最近在园子了浏览了几篇有关Socket文章,得到了一些启发萌生了想要重构公司在2000年用.NET Framework 2.0 与 Visual Studio 2005开发的AsySocke ...

  8. 提示Can't load package:dclite70.bpl解决方法

    64位系统安装Delphi7提示Can’t load package:dclite70.bpl 2015年04月05日 ⁄ 杂谈 ⁄ 共 392字 ⁄ 字号 小 中 大 ⁄ 暂无评论 ⁄ 阅读 1,7 ...

  9. winform C#获得Mac地址,IP地址,子网掩码,默认网关

    1.添加程序集 2.引入命名空间 using System.Management; 3.方法 ManagementClass mc = new ManagementClass("Win32_ ...

  10. Microsoft.CSharp.CSharpCodeProvider

    Microsoft.CSharp.CSharpCodeProvider MSDN 提供对 C# 代码生成器和代码编译器的实例的访问.类提供可用来检索 C# ICodeGenerator 和 ICode ...