以微秒精度获取时间点

Posted

技术标签:

【中文标题】以微秒精度获取时间点【英文标题】: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函数,但它的分辨率是一秒。

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于以微秒精度获取时间点的主要内容,如果未能解决你的问题,请参考以下文章

如何以微秒精度计算操作时间

JAVA中如何获取毫秒和微秒数

mongoDB 以微秒为单位获取查询的执行时间

从 unix 时间戳获取 ISOString(以微秒为单位)

c_cpp 以C为单位获取当前时间,以微秒为单位。

java中的当前时间(以微秒为单位)