以微秒精度获取时间点
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();
【讨论】:
以上是关于以微秒精度获取时间点的主要内容,如果未能解决你的问题,请参考以下文章