求助:计算程序某个模块的运行所耗时间

na1ve 2005-08-13 01:57:29
也就是为了测试不同的算法的执行效率,时间精度可否达到微妙级以上,如0. 000 000 1秒,怎么实现呢?我只能做到毫秒级,请高手提示。
是否能利用CPU本身时钟?
...全文
217 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
51365133 2005-08-16
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <windows.h>
#include <winbase.h>
int main()
{
int begin=GetTickCount();
for (int i=0;i<9999999;i++);
int end=GetTickCount();
printf("一共执行了%d",end-begin);
system("pause");
return 0;
}
xiaocai0001 2005-08-16
  • 打赏
  • 举报
回复
//刚在网上看到一个程序
//运行时间不能太长,太长了时间就不对了


long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow;
//获取代码运行开始时cpu内部计数器的值
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
}

//自己的程序代码放在这里

__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
;获取两次计数器值得差
sub eax, LowStart
cmp eax, 0 ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
jg L1
neg eax
jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx
}
//把两个计数器值之差放在一个64位的整形变量中
//先把高32位左移32位放在64的整形变量中,然后再加上低32位
__int64 timer =(numhigh<<32) + numlow;
//输出代码段运行的时钟周期数
//以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^
cout<<"Time elapsed: "<< (double) (timer /1.7/1000000000) << endl;
//获取代码结束时cpu内部计数器的值,并减去初值
trackant 2005-08-16
  • 打赏
  • 举报
回复
是windows的API
可以用Intel处理器本身的时间戳,精度达到cpu时钟周期的量级,但要嵌入汇编代码,而且多半不需要这样高的精读,不建议使用。
如果算法的效率有很明显的差距,能给理论结果就差不多了,如果确实要测试且要较高精度时,可以提高问题的规模,或将算法循环执行多次并测量运行总时间,再取平均值。
na1ve 2005-08-16
  • 打赏
  • 举报
回复
C语言里怎么实现呢?
na1ve 2005-08-16
  • 打赏
  • 举报
回复
QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数 是否windows API?
我在BCB里运行不了
na1ve 2005-08-16
  • 打赏
  • 举报
回复
看不大懂,先试试
谢谢了
cenlmmx 2005-08-13
  • 打赏
  • 举报
回复
QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为:

  BOOL QueryPerformanceFrequency(LARGE—INTEGER *lpFrequency);

  BOOL QueryPerformanceCounter(LARGE—INTEGER *lpCount) ;

----------------------------------------------------------------------
  typedef union —LARGE—INTEGER
  {
   struct
   {
  DWORD LowPart; // 4字节整型数
  LONG  HighPart; // 4字节整型数
  };
  LONGLONG  QuadPart;
  // 8字节整型数

  } LARGE—INTEGER;

  LARGE—INTEGER litmp;
  LONGLONG QPart1,QPart2;
  double dfMinus, dfFreq, dfTim;

  QueryPerformanceFrequency(&litmp);

  // 获得计数器的时钟频率
  dfFreq = (double)litmp.QuadPart;
  QueryPerformanceCounter(&litmp);

  // 获得初始值
  QPart1 = litmp.QuadPart;

  Sleep(100) ;

  QueryPerformanceCounter(&litmp);

  // 获得终止值
  QPart2 = litmp.QuadPart;
  dfMinus = (double)(QPart2 - QPart1);
  dfTim = dfMinus / dfFreq;

  // 获得对应的时间值

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧