繁体   English   中英

自处理器启动以来,从std :: chrono :: steady_clock :: now()获得微秒时间

[英]Getting Microseconds time from std::chrono::steady_clock::now() since processor power-up

自处理器启动以来,我试图以毫秒为单位获取时间,

自从时代开始,我已经看过很多帖子,但是自上电以来我需要时间

我也试图获取一个较长的时间,而不是time_point。

从time_point转换为long int的最佳和最快方法是什么?

最后,我不确定boost :: steady_clock和std :: steady_clock之间有什么区别,

感谢:D

我不知道在Linux下可以使正常运行时间达到微秒级分辨率的机制,但是sysinfo提供了一种简单的机制来以秒级分辨率进行检索:

#include <sys/sysinfo.h>

struct sysinfo info;
if( sysinfo( &info ) != 0 )
{
    // handle the failure
}

// uptime in seconds is available (as a long) in info.uptime

我假设从time_pointlong转换现在不相关,但是时间点表示特定的时间点,而不是从参考点开始经过的时间长度。 要从起点开始转换为多个时间单位,您需要将其转换为持续时间(减去起点),然后使用duration_cast进行转换以转换为您选择的单位。 例如:

using namespace std::chrono; // for brevity in the example code.    

auto elapsed = duration_cast<milliseconds>( timepoint1 - reftimepoint ).count()

boost::steady_clock是C ++标准库中包含std::steady_clock之前存在的实现。 除非您处理的是旧代码库,或者需要移植到不支持C ++ 11的编译器或平台,否则我认为您现在不需要使用boost::steady_clock了。

我已经验证了以下C函数,您也可以在C ++中使用它。

#include <stdio.h>
#include <time.h>

int main(int argc, char* argv[]) {
  struct timespec t;
  clock_gettime(CLOCK_MONOTONIC, &t);
  printf("tv_sec=%llu tv_nsec=%llu\n",
    (unsigned long long)t.tv_sec,
    (unsigned long long)t.tv_nsec);
  return 0;
}

当我运行以上代码与系统正常运行时间进行比较时,它们几乎相同。

rajg@rajg-LinuxVM:~/Desktop/WinShare$ cat /proc/uptime && ./time
52.46 2.88
tv_sec=52 tv_nsec=468791899

rajg@rajg-LinuxVM:~/Desktop/WinShare$ cat /proc/uptime && ./time
61.08 2.88
tv_sec=61 tv_nsec=81561476

rajg@rajg-LinuxVM:~/Desktop/WinShare$ cat /proc/uptime && ./time
63.97 2.88
tv_sec=63 tv_nsec=979358440

rajg@rajg-LinuxVM:~/Desktop/WinShare$ cat /proc/uptime && ./time
65.05 2.88
tv_sec=65 tv_nsec=52160586

rajg@rajg-LinuxVM:~/Desktop/WinShare$ cat /proc/uptime && ./time
75.44 12.47
tv_sec=75 tv_nsec=448578284

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM