1)方法一
可以通过调用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);
2)方法二
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);
3)方法三
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);
阅读(1812) | 评论(0) | 转发(0) |