Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126315
  • 博文数量: 26
  • 博客积分: 15
  • 博客等级: 民兵
  • 技术积分: 15
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-24 21:45
文章分类
文章存档

2019年(1)

2018年(6)

2017年(17)

2016年(2)

我的朋友

分类: Windows平台

2017-03-24 13:10:39

1)方法一
可以通过调用QueryPerformanceFrequency函数获得计时器的频率。假设调用该函数返回3579545,这样这个计数器每次计数的时间为1/3579545秒,大约为0.28us。计算出每一个计数的计数时间之后,再调用QueryPerformanceCounter返回程序计数的几次,将计数次数乘以每次计数的时间(0.28us)就是程序运行的时间了。
实例代码如下:

点击(此处)折叠或打开

  1. LARGE_INTEGER freq;
  2. LARGE_INTEGER StartTime,EndTime;
  3. LARGE_INTEGER ElapsedTime,ElapsedMicroseconds;
  4. QueryPerformanceFrequency(&freq);
  5. QueryPerformanceCounter(&StartTime);
  6. <...your code here...>
  7. QueryPerformanceCounter(&EndTime);
  8. ElapsedTime = EndTime-StartTime;
  9. ElapsedMicroseconds=ElapseTime/freq;
  10. printf("Time in micro seconds %d\n",ElapsedMicroseconds);
2)方法二
Intel Pentium处理器之中提供了一个时间戳计数器,它以64位无符号整型数的格式记录了自CPU上电以来所经过的时钟周期数。由于目前的CPU主频都非常高,因此可以达到纳秒级的计时精度。机器指令RDTSC(Read Time Stamp Counter)可以用来读取这个计数器的当前值,并将其保存到EDX:EAX寄存器当中。下面两段代码分别给出了32bit和64bitCPU时钟进行计时的实例:

点击(此处)折叠或打开

  1. DWORD StartTime,ElapsedTime;
  2. _asm{
  3. RDTSC
  4. mov StartTime,eax
  5. }
  6. <..your code here..>
  7. _asm{
  8. RDTSC
  9. sub eax,StartTime
  10. ,pv ElapsedTime,eax
  11. }
  12. printf("Time in CPU clocks %d\n",ElapsedTime);

  13. __int64 StartTime,ElapsedTime;
  14. _asm{
  15. RDTSC
  16. mov DWORD PRT StartTime,eax
  17. mov DWORD PRT StartTime+4,edx
  18. }
  19. <..your code here..>
  20. _asm{
  21. RDTSC
  22. mov DWORD PTR EndTime,eax
  23. mov DWORD PRT EndTime+4,eax
  24. }
  25. printf("Time in CPU clocks %I64d",EndTime-StartTime);
3)方法三
Intel的IPP性能库也提供了相应的函数来进行计时。IPP函数CoreGetCpuClocks实际上也是读取Intel处理器的硬件时钟,返回一个64bit的整数,下面的代码给出了实例:

点击(此处)折叠或打开

  1. #include "ipp.h"
  2. Ipp64u StartTime,EndTime;
  3. StartTime=ippCoreGetCpuClocks();
  4. <...your code here...>
  5. EndTime = ippCoreCpuClocks();
  6. printf("Time in CPU clocks %I64d",EndTime-StartTime);



阅读(1812) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~