【发布时间】:2016-04-25 20:28:05
【问题描述】:
我试图以微秒为单位获取处理器启动后的时间,
自从纪元以来,我看到了很多给时间的帖子,但我需要从上电开始的时间
我也试图让时间成为一个长整数,而不是一个 time_point。
从 time_point 转换为 long int 的最佳和最快方法是什么。
最后,我不确定 boost::steady_clock 和 std::steady_clock 之间有什么区别,
谢谢, -D
【问题讨论】:
我试图以微秒为单位获取处理器启动后的时间,
自从纪元以来,我看到了很多给时间的帖子,但我需要从上电开始的时间
我也试图让时间成为一个长整数,而不是一个 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_point 到 long 的转换现在不相关,但时间点表示特定时间点,而不是从参考点经过的时间长度。要转换为自起点以来的多个时间单位,您需要将其转换为持续时间(通过减去您的起点)并使用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
【讨论】: