Visual C++ 7.1Visual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XP中级开发Visual StudioWindowsC++
如何获得精确到纳秒或更好的时间






4.53/5 (33投票s)
2003年12月3日
1分钟阅读

185459
如何获得精确到纳秒或更好的时间
引言
大家可能都用过古老的 time(NULL)
来获取精确到秒的时间。有些人可能用过 GetSystemTime()
来获取亚秒级的时间。真正厉害的人发现了 QueryPerformanceFrequency
和 QueryPerformanceCounter
,它们可以提供精确到毫秒甚至更高的计时(说实话,我并不算厉害,我是通过阅读 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 可以获取机器的速度。你可以通过“校准”结果(获取计数,休眠(例如)一秒钟,再次获取计数,然后进行一些简单的数学运算),或者直接使用周期,而不用担心秒(这对于比较一个算法到另一个算法,或者找到程序的慢速部分非常有用)。
但是,有一个警告:某些机器,特别是笔记本电脑,在没有重要事情发生时可能会降低处理器速度。由于校准休眠正是其中一个时间点,因此你可能会从校准中获得一些严重错误的结果。