原文地址:http://www.songho.ca/misc/timer/timer.html

一、C计时器

C语言标准库里提供了clock()函数来测量代码执行时间,包含在#include<time.h>头文件中。该函数和系统平台相互独立,支持多种系统运行,但精度不高,甚至达不到毫秒的精度。

可以使用下面的代码测试clock()的精度。输出结果即是函数clock()可以测量的最小时间差(不同的系统可能得到的结果不同,博主分别在ubuntu和windows系统测量的最小时间差为1ms和15ms)。

#include <iostream>
#include <ctime>
using namespace std;int main()
{clock_t t1, t2;t1 = t2 = clock();// loop until t2 gets a different valuewhile(t1 == t2)t2 = clock();// print resolution of clock()cout << (double)(t2 - t1) / CLOCKS_PER_SEC * 1000 << " ms.\n";return 0;
}

因此,需要一个精度至少为1ms的计时器来测量时间。好消息是已经有更高精度的计时器,但坏消息是这些函数并不能跨平台使用。换句话说,就是在不同的系统上必须编写不同的代码。Windows提供了QueryPerformanceCounter()函数,而Unix、Linux以及Mac系统则使用gettimeofday()函数(该函数包含在#include<sys/time.h>头文件中)。这两个函数均可以达到至少1ms的测量时间精度。

二、Windows

Windows API提供了精度非常高的时间函数,QueryPerformanceCounter()函数和QueryPerformanceFrequency()函数。QueryPerformanceCounter()函数用来获取当前的时间ticks,QueryPerformanceFrequency()函数则用来获得每秒的ticks数,通过这两个函数就可以将ticks转化成实际的时间。

下面代码给出了QueryPerformanceCounter()函数的使用方法。

#include <iostream>
#include <windows.h>                // for Windows APIs
using namespace std;int main()
{LARGE_INTEGER frequency;        // ticks per secondLARGE_INTEGER t1, t2;           // ticksdouble elapsedTime;// get ticks per secondQueryPerformanceFrequency(&frequency);// start timerQueryPerformanceCounter(&t1);// do something...// stop timerQueryPerformanceCounter(&t2);// compute and print the elapsed time in millisecelapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart;cout << elapsedTime << " ms.\n";return 0;
}

三、Unix、Linux和Mac

gettimeofday()函数被用在Unix、Linux和Mac系统上测量时间,包含在头文件#include<sys/time.h>中。该函数的测量精度同样为1ms。下面给出代码示例。

#include <iostream>
#include <sys/time.h>                // for gettimeofday()
using namespace std;int main()
{timeval t1, t2;double elapsedTime;// start timergettimeofday(&t1, NULL);// do something...// stop timergettimeofday(&t2, NULL);// compute and print the elapsed time in millisecelapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;      // sec to mselapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;   // us to mscout << elapsedTime << " ms.\n";return 0;
}

四、C++ Timer Class

该timer类同时包含了QueryPerformanceCounter()函数和gettimeofday()函数,因此可以在Windows和Unix/Linux/Mac系统上使用。同时,它提供了简易的接口可以轻松获取代码执行时间。

源代码可以从这里下载:timer.zip

下面给出基本的使用示例。

#include <iostream>
#include "Timer.h"
using namespace std;int main()
{Timer timer;// start timertimer.start();// do something...// stop timertimer.stop();// print the elapsed time in milliseccout << timer.getElapsedTimeInMilliSec() << " ms.\n";return 0;
}

高精度计时器(High Resolution Timer)相关推荐

  1. 利用Boost库实现高精度计时器(1us)

    Boost库实现高精度时间 1 关于Boost 2 一个特别之处 3 高精度计时器 4 简析 1 关于Boost Boost库代表C++语言最新.最前沿的技术:C++中语言特性有2/3来自Boost ...

  2. Windows/Linux高精度计时器(C++)

    /* * Linux/Windows 系统高精度计时器 */#ifndef __LX_TIMER_H__ #define __LX_TIMER_H__ #ifdef WIN32 #include #e ...

  3. 添加高精度计时器测量处理能力

    文章目录 1 添加高精度计时器测量处理能力 1 添加高精度计时器测量处理能力 这里我们为服务端添加高精度计时器来测量处理能力,这里使用C++11提供的库来实现. CELLTimeStamp.hpp: ...

  4. 高精度计时器(编程测试效率用)

    高精度计时器(编程测试效率用) 1.HiPerfTimer.cs using System; using System.Runtime.InteropServices; using System.Co ...

  5. php hrtime stopwatch,学习PHP中的高精度计时器HRTime扩展

    学习PHP中的高精度计时器HRTime扩展 不知道大家还记得在学校的时候体育测试时老师带的秒表吗?当枪声想起时,我们开始跑步,这时秒表启动,当我们跑过终点后,老师会按下按扭记录我们的成绩,这就是一个典 ...

  6. Espressif 玩转 High Resolution Timer

    应用中经常需要用到 timer,对于 ms 级别的定时需求,FREERTOS 中的 Software Timer 完全就可以满足需求,唯一不足的是 FREERTOS 中的 Software Timer ...

  7. 官方文档翻译-ESP32-High Resolution Timer

    高分辨率定时器 概述 Although FreeRTOS provides software timers, these timers have a few limitations: 虽然FreeRT ...

  8. java中计时器的用法Timer和TimerTask的用法__java中利用Timer与TImerTask 计时器间隔执行任务...

    经常我们都会有这样的需求,要固定的每隔一段时间执行某一个任务.比如: 我们做一个缓存来减少与数据库的交互,而为了使缓存与数据库中的数据尽量达到同步,需要每个固定的一段时间去数据库中的数据是否有更新以达 ...

  9. 高精度计时器 -- C++/Windows版

    在VC++程序里面做计时器可以用CTime,但是这个精度不高,尤其是在时间间隔很短的情况下可能根本没法用. 对于软件测试,可能需要知道精度很高的时间间隔,这个时候最适合用的就是:QueryPerfor ...

最新文章

  1. 函数中返回char *类型
  2. 通过防火墙堵住×××安全漏洞
  3. .NET开源社区存在的问题
  4. Canvas -画图 关键字
  5. [ural1297]Palindrome
  6. 让电脑只能上允许的QQ号
  7. C语言开发环境搭建及调试
  8. 【原创】PHP 邮件自动发送(QQ邮箱)
  9. 行业如此内卷,品牌如何实现可持续招商增长?
  10. 【第一组】第五次冲刺例会纪要
  11. XTUOJ-1272-Robot
  12. Linux上一款强大的GIF录制软件,Peek
  13. 二、rally使用指导
  14. 编写一个简单的“个人简历”网页
  15. 微信可上线类型与封杀理由
  16. MTO 和MaTO MMDTLZ
  17. p82 红蓝对抗-蓝队atckDs蜜罐威胁情报
  18. 远程服务器架构,.NET远程处理框架详解
  19. shiro中登录的时候url地址栏带jsessionid的两种方式
  20. 温德姆酒店集团迁移至亚马逊云 应对后疫情旅游高峰

热门文章

  1. 鸿蒙系统手机mate30lite,为鸿蒙铺路 华为Mate 30 Lite要用鸿蒙系统
  2. mate20pro测试绿屏 软件,如何检测mate20pro绿屏
  3. 数字化转型(Digital Transform)
  4. 使用三次多项式拟合天猫双十一交易额
  5. 一个水分子的质量大约为3.0*10-23g,1夸脱水 大约有950g。编写一个程序,要求输入水的夸脱数, 然后显示这么多水中包含多少个水分子。
  6. Dictionary排序
  7. 今日起,白嫖阿里云服务器,1年!
  8. 嵌入式Android 主板rK3288主板四核rK3288一体板ARM主板瑞芯微主板
  9. [Go语言入门] 14 Go语言goroutine和通道详解
  10. NETCAT端口扫描