65.9K
CodeProject 正在变化。 阅读更多。
Home

如何获得精确到纳秒或更好的时间

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.53/5 (33投票s)

2003年12月3日

1分钟阅读

viewsIcon

185459

如何获得精确到纳秒或更好的时间

引言

大家可能都用过古老的 time(NULL) 来获取精确到秒的时间。有些人可能用过 GetSystemTime() 来获取亚秒级的时间。真正厉害的人发现了 QueryPerformanceFrequencyQueryPerformanceCounter,它们可以提供精确到毫秒甚至更高的计时(说实话,我并不算厉害,我是通过阅读 Python 文档才了解这两个函数的… 感谢 Guido!)。

但是,如果你真的想要精确的计时,这段代码可以提供精确到机器周期的计时,在 1 GHz 的机器上是 1 纳秒。在 2 GHz 的机器上,是 1/2 纳秒。旧的 100 MHz 机器只能获得 10 纳秒的计时。你明白我的意思了。

它需要一点汇编代码,但值得这样做。

__int64 GetMachineCycleCount()
{      
   __int64 cycles;
   _asm rdtsc; // won't work on 486 or below - only pentium or above
   _asm lea ebx,cycles;
   _asm mov [ebx],eax;
   _asm mov [ebx+4],edx;
   return cycles;
}

这段代码可以在 Win9X 或 NT/2K 以及可能在 XP 上运行。实际上,如果你能弄清楚如何让 GCC 发出内联汇编,它甚至可以在 Linux 上运行!

当然,时间以周期为单位,而不是秒,而且奇怪的是,似乎没有 API 可以获取机器的速度。你可以通过“校准”结果(获取计数,休眠(例如)一秒钟,再次获取计数,然后进行一些简单的数学运算),或者直接使用周期,而不用担心秒(这对于比较一个算法到另一个算法,或者找到程序的慢速部分非常有用)。

但是,有一个警告:某些机器,特别是笔记本电脑,在没有重要事情发生时可能会降低处理器速度。由于校准休眠正是其中一个时间点,因此你可能会从校准中获得一些严重错误的结果。

如何获得像一纳秒或更高的精细计时 - CodeProject - 代码之家
© . All rights reserved.