我需要以微秒的精度检索当前时间点。时间点可以相对于任何固定日期。
如何实现?对于工作政策,我真的不应该使用boost
或任何其他lib。
我正在使用多平台应用程序,在Linux下,我可以使用C ++ 11 system_clock::now().time_since_epoch()
,但在Windows下我使用VS2010,所以我没有std::chrono
库。
我见过RtlTimeToSecondsSince1970
函数,但它的分辨率是秒。
答案 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;
}