CC++中计时、延时函数「建议收藏」

时序和延迟在C/C++中非常重要。
2 02 2 年,我在做一个项目时遇到了这个问题。
它可以使用标准库或系统函数来完成。

我们先来谈谈时机。
Clock()这个东西是统计CPU时间的,而且精度还可以。
它返回一个clock_t,它是一个表示时钟滴答数的整数。
使用时,需要除以频率(Windows 为 CLK_TCK,Linux 为 CLOCKS_PER_SEC),转换为秒。
之前写代码的时候忘记了除频,结果计算出来的时间就乱了。
一个小例子:
cpp 包括 包括 使用命名空间 std;
int main(){ Clock_t 启动、停止; 开始=时钟(); // 这段代码的作用是什么? 停止=时钟(); 双倍持续时间=(双倍)(停止
开始)/ CLOCKS_PER_SEC; cout << "耗时:" << 持续时间 << "s" << endl> time() 函数获取系统时间,即日历时间。
自 1 9 7 0 年以来的秒数称为 time_t。
这玩意的精度不算很高,只是二级而已。
如果想知道差异,需要使用 difftime() 来计算,并将结果转换为 double。
参数可以传NULL,时间不会被保存。
有时我会写:
cpp 包括 包括 使用命名空间 std;
int main(){ time_t 开始、停止; 开始=时间(NULL); //这段代码的作用是什么? 停止=时间(NULL); 双持续时间 = difftime(停止, 开始); cout << "耗时:" << 持续时间 << "s" << endl> 我们来谈谈延迟。
在Windows环境下,使用Sleep()时,头文件中必须添加,单位为毫秒。
例如,如果我想小睡 5 秒,我必须输入 Sleep(5 000)。
以前用的时候总是拼错,写成了Sleep(5 )。
结果延迟只有一毫秒,很烦人。
Linux环境下,使用sleep(),头文件为,单位为秒。
例如,如果延迟为 5 秒,请键入 sleep(5 )。
在MFC环境中,还可以使用_sleep(),同样是毫秒。
我当时用的是Windows,写了一个跨平台的宏:
cpp ifdef_WIN3 2 包括 定义 DELAY(x) 睡眠(x) 其他 包括 定义 DELAY(x) sleep(x) endif
int main(){ 延迟(5 000); // 跨平台延迟5 秒 返回0;
但请注意,延迟会阻塞当前线程。
如果在多线程中使用的话,整个程序就会卡住,这样就不好了。
我写线程池的时候就踩到了这个坑,导致程序崩溃。

此外,clock() 有时不起作用。
例如,在多线程中,它只能统计主线程的CPU时间,而不能统计其他线程的CPU时间。
在一些系统中,clock()计算的时间还可能包括睡眠时间。
你必须自己测试一下。
time()函数的精度太低,为秒级,无法在短时间内准确测量。
我曾经以毫秒为单位测量算法,但我无法使用 time() 来测量它。

简而言之,您需要选择正确的延时函数。
为了高精度,请使用clock(),但必须考虑平台差异。
一个粗略的测试是 time()。
至于延迟,使用宏来分隔平台,但请记住它卡在线程中。
当时我写了一个小工具来使用clock()来测量网络请求时间,但发现它不准确。
当我询问时,我发现服务器响应很快,并且clock()不够准确。
后来我切换到毫秒时一切顺利。

linux proc/stat不准

嗯... /proc/stat...这个东西...你不能只看它并确保它是准确的。

是积累的...从电脑运行开始就记录的...比如说...比如说...2 02 2 ...某个城市...不...某个系统...比如说运行了好几个小时...用户字段...坦白说添加了...添加了多少...你看一次...1 000个球童...不能说这一秒用了1 000具尸体...
你得看两遍...时间差是更长...例如,...嗯...一秒...再看...用户变成1 05 0...嗯...然后5 0尸体...大约0.5 秒...除以1 秒...那就是5 0%...大致是这样...
看...这个东西...比较烦人...你必须记住...时间差...
而且...内核版本不同...字段可能会改变...例如...过去的旧Linux 2 .6 ...就这几个...用户,不错,系统,空闲...简单...现在...嗯...也许还有更多的iwait...或者其他...你要看清楚...比如...你...用了2 02 2 年的新版本...发现多了一个字段...你必须知道它代表什么...
我记得我以前...看数据...我很困惑...为什么用户比上次小...后来我意识到...因为系统刚刚启动...空闲了很长时间...对...你不能比较盲目的...
计算的时候...不要直接用奇异值除以总的Jeeves...没有意义...如果一定要使用的话...必须用差值除以时间差...这个是最重要的...我当时很迷茫...
还有...多核CPU...比较麻烦...你得统计每个核...加上它的用户,不错...然后算出总的使用时间...然后除以总的时间...这就是总的使用时间...你不能只看一行...
而且.../proc/stat...全局...整个系统...如果你想看某个特定的进程...比如PID是1 2 3 4 ...那么你就得去/proc/1 2 3 4 /stat...里面有这个进程的用户和时间...同样...你得利用时差...嗯...普通用户只能看到自己的进程...看根...其他人...你要注意这个...
总之... /proc/stat...数据本身不是假的...是假的...怎么用...怎么理解...你得找出它是累加的...怎么实时计算...版本有差异...全局情况而且过程不一样...我弄清楚了...我可以得到一些有用的数据...也许...
不幸...反正...你不能直接看到...对...你无法直接看到它。

Linux下的clock_gettime()获取系统时间跳变问题

说白了,在clock_gettime()中使用CLOCK_REALTIME很容易出现问题,因为系统时间可能会被调整,导致跳转。
展开:当我们第一次使用CLOCK_REALTIME时,去年我们正在运行监控系统,当我们在半夜同步时,我们看到时间从中午1 2 点直接跳到下午2 点,日志全乱了。
还有一点:选择CLOCK_MONOTONI使得clk_id C稳定。
去年3 000级项目测试中,从启动到关闭的秒数只增加了。
还有另一个重要的细节。
is_steady属性是一个布尔值,但你需要知道为什么它是假的——系统时间准时响起,就像闹钟一样。
起初我以为加一个卧铺就可以防止跳跃,但后来我发现这是错误的。
如果你改变闹钟响之前的时间,它仍然会跳动。
等等,还有别的事。
用技术术语来说,我们所说的是雪崩效应。
事实上,前面的一点延迟就会导致后面的整个事情停止。
设置计划任务时,建议不要直接使用CLOCK_REALTIME,而是尝试CLOCK_MONOTONIC。
我认为值得一试。