可以通过调用QueryPerformanceFrequency函数获得计时器的频率。假设调用该函数返回3579545,这样这个计数器每次计数的时间为1/3579545秒,大约为0.28us。计算出每一个计数的计数时间之后,再调用QueryPerformanceCounter返回程序计数的几次,将计数次数乘以每次计数的时间(0.28us)就是程序运行的时间了。
实例代码如下:
点击(此处)折叠或打开
- LARGE_INTEGER freq;
- LARGE_INTEGER StartTime,EndTime;
- LARGE_INTEGER ElapsedTime,ElapsedMicroseconds;
- QueryPerformanceFrequency(&freq);
- QueryPerformanceCounter(&StartTime);
- <...your code here...>
- QueryPerformanceCounter(&EndTime);
- ElapsedTime = EndTime-StartTime;
- ElapsedMicroseconds=ElapseTime/freq;
- printf("Time in micro seconds %d\n",ElapsedMicroseconds);
Intel Pentium处理器之中提供了一个时间戳计数器,它以64位无符号整型数的格式记录了自CPU上电以来所经过的时钟周期数。由于目前的CPU主频都非常高,因此可以达到纳秒级的计时精度。机器指令RDTSC(Read Time Stamp Counter)可以用来读取这个计数器的当前值,并将其保存到EDX:EAX寄存器当中。下面两段代码分别给出了32bit和64bitCPU时钟进行计时的实例:
点击(此处)折叠或打开
- DWORD StartTime,ElapsedTime;
- _asm{
- RDTSC
- mov StartTime,eax
- }
- <..your code here..>
- _asm{
- RDTSC
- sub eax,StartTime
- ,pv ElapsedTime,eax
- }
- printf("Time in CPU clocks %d\n",ElapsedTime);
- __int64 StartTime,ElapsedTime;
- _asm{
- RDTSC
- mov DWORD PRT StartTime,eax
- mov DWORD PRT StartTime+4,edx
- }
- <..your code here..>
- _asm{
- RDTSC
- mov DWORD PTR EndTime,eax
- mov DWORD PRT EndTime+4,eax
- }
- printf("Time in CPU clocks %I64d",EndTime-StartTime);
Intel的IPP性能库也提供了相应的函数来进行计时。IPP函数CoreGetCpuClocks实际上也是读取Intel处理器的硬件时钟,返回一个64bit的整数,下面的代码给出了实例:
点击(此处)折叠或打开
- #include "ipp.h"
- Ipp64u StartTime,EndTime;
- StartTime=ippCoreGetCpuClocks();
- <...your code here...>
- EndTime = ippCoreCpuClocks();
- printf("Time in CPU clocks %I64d",EndTime-StartTime);