获得微秒精度的时间点

时间:2015-04-22 10:25:29

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

定时器和时序是一个非常棘手的主题,在我看来,当前的跨平台实现并不是很容易实现。因此,我建议使用具有适当#ifdef的Windows的特定版本。如果您想要跨平台版本,请参阅其他答案。

如果您已经/想要使用特定于Windows的呼叫,那么GetSystemTimeAsFileTime(或在Windows 8 GetSystemTimePreciseAsFileTime上)是获得UTC时间和QueryPerformanceCounter的最佳呼叫适用于高分辨率时间戳。它将自1601年1月1日开始的 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;

答案 1 :(得分:0)

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

答案 2 :(得分:0)

此代码适用于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;
}