【问题标题】:Getting Microseconds time from std::chrono::steady_clock::now() since processor power-up自处理器启动以来从 std::chrono::steady_clock::now() 获取微秒时间
【发布时间】:2016-04-25 20:28:05
【问题描述】:

我试图以微秒为单位获取处理器启动后的时间,

自从纪元以来,我看到了很多给时间的帖子,但我需要从上电开始的时间

我也试图让时间成为一个长整数,而不是一个 time_point。

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

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

谢谢, -D

【问题讨论】:

    标签: c++ linux


    【解决方案1】:

    我不知道在 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

    【讨论】:

      【解决方案2】:

      我已经验证了下面的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多