获取微秒精度的时间点

Getting time point with microseconds precision

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

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

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

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

以下代码适用于 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();
}

计时器和计时是一个非常棘手的主题,在我看来,当前的跨平台实现还没有达到标准。因此,我会为 windows 推荐一个具有适当 #ifdef 的特定版本。如果您想要跨平台版本,请参阅其他答案。

如果您 to/want 使用 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;

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

基本上,您可以使用 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;
}