在C++的主逻辑中接收真实/用户/系统时间

Receiving real/user/system times within main logic of C++

本文关键字:真实 用户 时间 系统 C++      更新时间:2023-10-16

C++中是否有等效的UNIX时间,它给出了真实的,用户和系统的执行时间,最好在main中?还是有没有非平凡的方法可以使用 chrono 等来实现相同的功能?

找不到record all three timestamps的时间用法,但only the real time based on timeclock链接。

旨在摆脱重定向运算符与可执行文件相结合,并尝试在 main 本身中嵌入时间逻辑。 time a.out 2> log.txt

使用 sys/times.hclock_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.htrealt" << parse_tim(real_clock) << "t"
            << "usert" << parse_tim(user_clock) << "t"
            << "syst" << 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_ttrealt" << parse_tim(real_dur) << "t"
            << "usert" << parse_tim(user_dur) << "t"
            << "syst" << 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