【问题标题】:Getting time point with microseconds precision以微秒精度获取时间点
【发布时间】:2015-04-22 10:25:28
【问题描述】:

我需要以微秒的精度检索当前时间点。时间点可以相对于任何固定日期。

如何实现?对于工作政策,我真的不应该使用boost 或任何其他库。

我在一个多平台应用程序中工作,在 Linux 下,我可以使用 C++11 system_clock::now().time_since_epoch(),但在 Windows 下我使用 VS2010,所以我没有 std::chrono 库。

我见过RtlTimeToSecondsSince1970函数,但它的分辨率是一秒。

【问题讨论】:

    标签: c++ windows visual-studio-2010 datetime time


    【解决方案1】:

    计时器和计时是一个相当棘手的主题,在我看来,当前的跨平台实现还没有完全达到标准。因此,我建议使用适当的#ifdef 的 Windows 特定版本。如果您想要跨平台版本,请查看其他答案。

    如果您必须/想要使用特定于 windows 的调用,那么GetSystemTimeAsFileTime(或在 windows 8 上 GetSystemTimePreciseAsFileTime)是获取 UTC 时间的最佳调用,QueryPerformanceCounter 适用于高分辨率时间戳。它将 自 1601 年 1 月 1 日 UTC 以来的 100 纳秒间隔数返回到 FILETIME 结构中。

    This fine article 详细介绍了在 Windows 中测量计时器和时间戳的血腥细节,值得一读。

    编辑:将 FILETIME 转换给我们,您需要通过 ULARGE_INTEGER。

    FILETIME ft;
    GetSystemTimeAsFileTime(&ft);
    ULARGE_INTEGER li;
    li.LowPart = ft.dwLowDateTime;
    li.HighPart = ft.dwHighDateTime;
    unsigned long long valueAsHns = li.QuadPart;
    unsigned long long valueAsUs = valueAsHns/10;
    

    【讨论】:

    • 好答案!我删除了我的并添加了“1601 年 1 月”部分。
    【解决方案2】:

    此代码在 VS2010 中适用于我。构造函数测试处理器上是否有可用的高精度计时,currentTime() 返回以秒为单位的时间戳。比较增量时间的时间戳。我将它用于游戏引擎以获得非常小的增量时间值。请注意,尽管返回值被如此命名(它是一个双精度值),但精度并不限于秒。

    基本上,您可以使用 QueryPerformanceFrequency 了解每个 cpu 滴答的秒数,并使用 QueryPerformanceCounter 获取时间。

    ////////////////////////
    //Grabs speed of processor
    ////////////////////////
    Timer::Timer()
    {
        __int64 _iCountsPerSec = 0;
        bool _bPerfExists = QueryPerformanceFrequency((LARGE_INTEGER*)&_iCountsPerSec) != 0;
        if (_bPerfExists)
        {
            m_dSecondsPerCount = 1.0 / static_cast<double>(_iCountsPerSec);
        }
    }
    
    
    ////////////////////////
    //Returns current real time
    ////////////////////////
    double Timer::currentTime() const
    {
        __int64 time = 0;
        QueryPerformanceCounter((LARGE_INTEGER*)&time);
        double timeInSeconds = static_cast<double>(time)* m_dSecondsPerCount;
        return timeInSeconds;
    }
    

    【讨论】:

      【解决方案3】:

      以下代码可在 Visual Studio 中运行。

      #include <time.h>
      clock_t start , end ;
      int  getTicks_u32()
      { 
          int cpu_time_used ;
          end = clock() ;
          cpu_time_used = (static_cast<int> (end - start)) / CLOCKS_PER_SEC;
          return cpu_time_used ;
      }
      void initSystemClock_bl(void)
      {
          start = clock();
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-29
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 2013-04-06
        相关资源
        最近更新 更多