时间函数
一、Sleep
(一)Sleep
功能: 执行挂起一段时间,也就是等待一段时间在继续执行
原理:Sleep函数是使调用Sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。Sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中,可能会看到Sleep(0),其主要目的是让出时间片。
精度:Sleep函数的精度非常低,当系统越忙它精度就越低。它的精度取决于线程自身的优先级、其它线程的优先级,以及线程的数量等因素。
注意:
(1)Sleep是区分大小写的,有的编译器是大写,有的是小写。
(2)Sleep括号里的时间,在windows下是已毫秒为单位,而Linux是以秒为单位
(二)sleep
为了在不同性能的计算机上实现同样速度的效果,在代码中添加如下的延时函数。
其他地方的用Sleep用sleep代替即可。
1.代码
void sleep(DWORD ms) // 精确延时函数 { static DWORD oldtime = GetTickCount(); while (GetTickCount() - oldtime < ms) Sleep(1); oldtime = GetTickCount(); }
(1)DWORD
DWORD 就是 Double Word, 每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位。
DWORD 代表 unsigned long,宏定义(minwindef.h):
typedef unsigned long DWORD;
DWORD是一个占四个字节即两个字的空间无符号整数,它能表示的最大值为2^32-1=4,294,967,695
二、C语言的Time
原理:主要用于获取当前时间。
精度:秒级别。
三、C语言下的时钟周期clock
原理:clock()是获取计算机启动后的时间间隔。
精度:ms级别,对于短时间内的定时或者延时可以达到ms级别,对于长时间的定时或者延迟的精度还是不够。
四、GetTickCount()
原理:GetTickCount()是获取系统启动后的时间间隔。与clock()一样,是向主板BIOS(BIOS,Basic Input/output system,即基本输入/输出系统)要real time clock时间,会有中断产生,以及延迟问题。
精度:WinowsNT 3.5以及以后版本精度是10ms,它的时间精度比clock要高。
GetTickCount返回从操作系统启动到现在所经过的毫秒数(ms),它的返回值是DWORD。GetTickCount函数的原型为(在sysinfoapi.h中):
DWORD
GetTickCount(
VOID
);
GetTickCount精确度有限,跟CPU有关,一般精确度在16ms左右,最精确也不会精确过10ms。
用一个DWORD类型的值存放一个时间数值,那么经历足够长的时间,这个数值一定会溢出绕回到零(wrap around to zero)。
一天有EachDay = 24*60*60*1000=86,400,000ms,4,294,967,695/86,400,000 = 49.71,所以若系统持续运行(run continuously)49.71天,这个数会溢出绕回到零。
五、QueryPerformanceFrequency
原理:CPU上也有一个计数器,以机器人的clock为单位,可以通过rdtsc读取,而不用中断,因此其精度与系统时间相当。
精度:计算机获取硬件支持,精度比较高,可以通过它来判断其它时间函数的精度范围。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了