c++ - 在 C++ 的主要逻辑中接收真实/用户/系统时间
问题描述
在 C++ 中是否存在等效的 UNIX 时间,它最好在 main 内提供实际的、用户和系统的执行时间?或者是否有不平凡的方法来使用chrono等来实现相同的功能?
找不到 chrono 的用法record all three timestamps
,但有only the real time based on timeclock
链接。
旨在摆脱与可执行文件相结合的重定向运算符,并尝试将时间逻辑嵌入 main 本身。
time a.out 2> log.txt
解决方案
使用sys/times.h
和解决clock_t
。
对于这两种方法,系统时间sys
都是使用 times.h 记录的,clock_t 的 REALTIME 记录更准确user
。
#include <iostream>
#include <sys/times.h>
std::string parse_tim(intmax_t milliseconds) {
std::string parsed;
intmax_t s = milliseconds / 1000;
intmax_t m = s / 60;
intmax_t h = m / 60;
intmax_t d = h / 24;
if(d > 0)
parsed = parsed + std::to_string(d) + "d";
if(! parsed.empty() || h > 0)
parsed = parsed + std::to_string(h%24) + "h";
if(! parsed.empty() || m > 0)
parsed = parsed + std::to_string(m%60) + "m";
parsed = parsed + std::to_string(s%60) + ".";
parsed = parsed + std::to_string(milliseconds%1000) + "s";
return parsed;
}
int main(int argc, char** argv) {
static struct tms st_cpu, en_cpu;
struct timespec ts1, tw1, ts2, tw2;
static clock_t st_time = times(&st_cpu);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts1);
clock_gettime(CLOCK_REALTIME, &tw1);
// Perform operations
// Perform operation
// Perform actions
static clock_t en_time = times(&en_cpu);
clock_gettime(CLOCK_REALTIME, &tw2);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts2);
auto real_clock = (intmax_t)(en_time - st_time) * 10;
auto user_clock = (intmax_t)(en_cpu.tms_utime - st_cpu.tms_utime) * 10;
auto sys_clock = (intmax_t)(en_cpu.tms_stime - st_cpu.tms_stime) * 10;
std::cerr << "time.h\treal\t" << parse_tim(real_clock) << "\t"
<< "user\t" << parse_tim(user_clock) << "\t"
<< "sys\t" << parse_tim(sys_clock) << std::endl;
auto real_dur = intmax_t(1000.0*tw2.tv_sec + 1e-6*tw2.tv_nsec - (1000.0*tw1.tv_sec + 1e-6*tw1.tv_nsec));
auto user_dur = intmax_t(1000.0*ts2.tv_sec + 1e-6*ts2.tv_nsec - (1000.0*ts1.tv_sec + 1e-6*ts1.tv_nsec));
auto sys_dur = intmax_t(en_cpu.tms_stime - st_cpu.tms_stime) * 10;
std::cerr << "clock_t\treal\t" << parse_tim(real_dur) << "\t"
<< "user\t" << parse_tim(user_dur) << "\t"
<< "sys\t" << parse_tim(sys_dur) << std::endl;
return 0;
}
time ./a.out
time.h real 4m2.460s user 5m57.140s sys 21.830s
clock_t real 4m2.457s user 6m18.976s sys 21.830s
real 4m2.498s
user 6m22.816s
sys 0m26.865s
推荐阅读
- kubernetes - Kubernetes Ingress 需要反向代理设置
- c - 关于 C 中 while 中的特定语法的问题
- apache-spark - Spark Connection 拒绝 BlockManager 进程
- node.js - NodeJS 分片架构与许多 MondoDB 数据库方法
- azure-data-lake - DataBricks - 将更改保存回 DataLake (ADLS Gen2)
- dataset - 从数据集中删除表适配器
- powershell - 复制当月的第一个文件
- sdl - 如何修复 SDL_CreateWindow 错误“窗口太大”
- node.js - 我有错误它在第 1 行字符 1 中显示语法错误
- windows - Golang MSI 在 Windows 上看不到已安装的驱动器