时间函数

参考文章:

https://blog.csdn.net/wozaiyizhideng/article/details/109036184

https://blog.csdn.net/crzmy/article/details/109537825

机器(硬件)时钟和系统时钟

  机器(硬件)时钟是存储在主板上CMOS里的时钟,关机后该时钟仍然在运行,主板的电池为它供电。机器(硬件)时钟又称实时时钟(Real Time Clock, RTC)或CMOS时钟,是独立的硬件设备(电池、电容元件等),保存的时间包括年、月、日、时、分、秒。2016年之后的UEFI固件还能保存时区和是否使用夏令时。

  系统时钟是软件系统的时钟,又称为软件时钟。软件启动时会取读取机器(硬件)时钟,启动之后则独立运行。

  这两者之间的区别在于系统时钟和机器(硬件)时钟可以采用异步方式,即系统时间和机器(硬件)时间可以不同。这样做的好处对于普通用户来说意义不大,但对于服务器管理员来说却有很大用处。例如,要将一个很大的网络中(跨越若干个时区)的服务器同步,加入位于美国纽约的服务器和北京的服务器,其中一台服务器无须改变硬件时钟而只需设置一个临时的系统时钟,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时钟就提供了更加灵活的操作。

时间函数

  在我们衡量一个函数的运行时间或者判断一个算法的执行效率、以及在程序中我们需要一个定时器,定时执行一个特定的操作,都会用到时间函数。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度各不相同。所以,如果我们想得到更加准确的结果,必须使用合适的时间函数。

Sleep

  原理:Sleep函数是使调用Sleep函数的线程休眠一段时间,线程主动放弃竞争CPU时间片。当经过指定的时间间隔后,便会再次启动线程,继续跟其他线程竞争CPU的时间片。Sleep函数并不能起到定时的作用,主要作用是延时(而且延迟并不精确,比如Windows作为一个分时操作系统,每个任务的调度时间是存在最小调度时间的,可能是几毫秒。那么这就意味着我们Sleep(5),实际上真实的休息时间可能是5 + 几毫秒)。所以就出现了在一些多线程的应用中,可能会看到Sleep(0),其主要目的是让出时间片。

如果想要提高Sleep的精度,可以使用timeBeginPeriod(1)、 timeEndPeriod(1)此类API进行修改。

  精度:Sleep的精度非常低,当系统越忙它精度越低。它的精度取决于线程自身的优先级、其他线程的优先级以及线程的数量等因素。

MFC的timer事件

  原理:timer是一个定时器,可以指定回调函数,默认是Ontimer()函数。

  精度:timer事件的精度范围在ms级别,系统越忙其精度越差。

C语言的Time

  原理:主要用于获取当前时间。

  精度:秒级别。

C语言下的时钟周期clock

  原理:clock()会返回处理器调用某个进程或函数所花费的时间。

  精度:ms级别,对于短时间内的定时或者延时可以达到ms级别,对于长时间的定时或者延时精度还是不够。

Windows下的GetTickCount

  原理:GetTickCount()是返回从操作系统启动后经过的毫秒数。与clock()一样,是向主板BIOS要real time clock事件,会有中断产生以及延迟问题。

  精度:WindowsNT 3.5以及以后版本精度是10ms,它的时间精度比clock要高。

高精度时控函数QueryPerformanceFrequency

  原理:CPU上也有一个计数器,以机器人的clock为单位,可以通过rdtsc读取,而不用产生中断,因此其精度与系统时间相当。

  精度:计算机获取硬件支持,精度比较高,可以通过它来判断其他时间函数的精度范围。

示例

#include <windows.h>
class TimerWatch {public:TimerWatch()  {}~TimerWatch() {}bool Init() {m_elapsed = 0;QueryPerformanceFrequency(&m_freq);return true;}bool UnInit() {m_elapsed = 0;return true;}bool Start() {QueryPerformanceCounter(&m_beginTime);return true;}bool Stop() {LARGE_INTEGER endTime;QueryPerformanceCounter(&endTime);m_elapsed = (endTime.QuadPart - m_beginTime.QuadPart) * 1000000 / m_freq.QuadPart;return true;}bool ReStart() {m_elapsed = 0;Start();return true;}double ElapsedUs() {return static_cast<double>(m_elapsed);}double ElapsedMs() {return m_elapsed / 1000.0;}double ElapsedS() {return m_elapsed / 1000000.0;}private:LARGE_INTEGER m_freq;LARGE_INTEGER m_beginTime;long long     m_elapsed;
};
int main() {TimerWatch test;test.Init();test.Start();for (int i = 0; i < 5; i++) {}test.Stop();std::cout << test.ElapsedMs() << std::endl;test.ReStart();test.UnInit();return 0;
}

时间函数(运行时间、执行时间、定时)相关推荐

  1. python计算时间装饰器_使用python装饰器计算函数运行时间的实例

    装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是利用python装饰器计算函数运行时间 一些需 ...

  2. utc时间转换为时分秒_C语言操作时间函数,实现定时执行某个任务小程序

    时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下. 时间概述 由上图可知: 通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calenda ...

  3. c语言 函数运行时间,[转载]C语言获得函数的执行时间

    C语言获得函数的执行时间 1. 精确到秒,计时单位为秒 #include time_t start_time,end_time; start_time=time(NULL): end_time=tim ...

  4. pg 定时删除_PostgreSQL的时间函数使用整理

    PG的时间函数使用整理如下 1.获取系统时间函数 ~~~ select now(); --2012-05-12 18:51:59.562+08 select current_timestamp; -- ...

  5. mysql运行时间函数_mysql 时间函数

    一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +-------------------- ...

  6. C语言再学习 -- 时间函数

    在软件设计中经常会用到关于时间的处理,用来计算语句.函数的执行时间,这时就需要精确到毫秒甚至是微妙的时间.我们首先来介绍一下,时间单位: 时间单位还有:秒(s).毫秒(ms).微秒 (μs).纳秒(n ...

  7. mysql中的竖线怎么用_Mysql event时间触发器,实现定时修改某些符合某一条件的某一字段...

    我最近做项目遇到一个问题就是数据库的的订单需要定时检查自己的订单状态,如果到了endtime字段的时间订单状态还是2,就将订单状态修改为4 在网上找到类似的解决方法. 定时的关键是要结合MySQL的某 ...

  8. STM32F407+CubeMX - 使用GPIO翻转+示波器测量函数的执行时间

    文章目录 一.前言 二.GPIO 三.代码 四.示波器测试结果 五.细节补充 一.前言 Keil | 使用Register Windows测量函数的运行总时间 先说明一下,这个测量方法跟STM32F4 ...

  9. 在Windows中测试c语言单个函数运行时间方法

    在做单片机项目开发的过程中,在特殊应用中对代码执行的时间有着严格的要求,那么如何准确的测试出每个函数的的运行速度是多快呢?通常用单片机测试的方法就是通过示波器观察. 比如现在要测试使用二分查找法,在数 ...

最新文章

  1. 如何去应付你的上司给你一个变化无常的需求?
  2. Springboot@Configuration和@Bean详解
  3. 前端如何高效的与后端协作开发
  4. 【资源】太赞了!程序员应该访问的最佳网站都在这里了!
  5. java list 比较_Java中List的五种去重方法及效率对比,你都用对了吗?
  6. sql 注射_基本注射/资格赛,范围
  7. linux网卡名称乱编,小斗CentOS7.x网卡名称错乱、及网卡启动失败。
  8. 基于Asp.net MVC的系统架构
  9. C#性能优化篇 - 基于索引器封装EPList
  10. mysql getname_mysql别名取不出值(getColumnLabel和getColumnName的区别)
  11. Pandas 基础(4) - 读/写 Excel 和 CSV 文件
  12. window.print()在页面全部加载完成后才能执行。切记。
  13. linux培训哪家好?Linux520内部培训教程
  14. 荣耀电视鸿蒙安装第三方软件,荣耀电视如何安装第三方应用?当贝市场几招搞定!...
  15. (2021)建筑能耗模拟的灰箱建模与应用——综述
  16. Python爬取网易云音乐热评(附源码)
  17. js对象数组中的某属性值,拼接成字符串形式
  18. linux的系统监视器图片_用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统 - 人工智能遇见磐创...
  19. 11代i5 NUC使用记录
  20. 【MySQL】MVCC多版本并发控制(重点:MVCC实现原理之ReadView)

热门文章

  1. mysql数据库迁移前后对比(准确无误)
  2. Java版人脸检测详解下篇:编码
  3. 自定义QQ和微信分享卡片
  4. 快速上手!7款简单易用的在线绘图工具推荐
  5. solidworks 草图 阵列修改_SolidWorks2018草图圆阵列命令教程
  6. 从dhcpd.lease中提取MAC和IP地址
  7. 常见路由协议组播地址
  8. LittlevGL测试Demo
  9. 谷歌系列手机刷机和面具ROOT教程
  10. android开发板!Android开发你需要了解的那些事,大牛最佳总结