QueryPerformanceCounter 程序运行时间的开销探讨

QueryPerformanceFrequency(&tc)

QueryPerformanceCounter(&t1);
 //Sleep(1000);
 QueryPerformanceCounter(&t2);

我们知道

(t2.QuadPart- t1.QuadPart)/tc.QuadPart

是我们计算出来的时间。但是不可忽略的是,时间测算也是需要时间的。

 

看如下测试程序:

#include <windows.h>
#include <stdio.h>

long long average(long long *p,int n)
{
 long long sum;
 int i;
 sum=0;
 for(i=0;i<n;i++)
 {
  sum=sum+p[i];
 }
 sum=sum/n;
 return sum;

}

main()
{

 LARGE_INTEGER t1, t2, tc;
 int i,j;
 long long average(long long *p,int n);
 int i_loop,o_loop;
 long long i_sum;


 long long *o_p;
 printf("input the inside loop num i_loop=");
 scanf("%d",&i_loop);
 printf("input the outside loop num i_loop=");
 scanf("%d",&o_loop);
    o_p=(long long *)malloc(sizeof(long long)*o_loop);

    i_sum=0;
 QueryPerformanceFrequency(&tc);
 printf("Frequency: %u\n", tc.QuadPart);
 for(j=0;j<o_loop;j++)
 {
  i_sum=0;
 for(i=0;i<i_loop;i++)
 {
 
 
 QueryPerformanceCounter(&t1); 
  QueryPerformanceCounter(&t2);
 
 i_sum=i_sum+t2.QuadPart- t1.QuadPart;
 
 }
 //printf("Begin Time: %u\n", t1.QuadPart);
 //printf("End Time: %u\n", t2.QuadPart);
 //printf("Lasting Time: %u\n",( t2.QuadPart- t1.QuadPart));
 //printf("i_sum=%u\n",i_sum/i_loop);
 //i_sum=i_sum/i_loop;
 o_p[j]=i_sum;
 }
 for(i=0;i<o_loop;i++)
 {printf("%u\n",o_p[i]);}
 printf("average is %u\n",average(o_p,o_loop));
 scanf("%u",i_loop);
}

 

按照 

(t2.QuadPart- t1.QuadPart)/tc.QuadPart

计算出来的确实是零。但是我们应该注意该公式中有一个除号。

大家都清楚的是当(t2.QuadPart- t1.QuadPart)<tc.QuadPart 时,改公式结果确实是0;

但不代表t2.QuadPart- t1.QuadPart就是零。事实上其也不会是零。

众所周知的是tc.QuadPart是我们主机的主频。我的机器是。程序给出的结果是:。不解释。

我们可以知道t2.QuadPart- t1.QuadPart是测试指令 QueryPerformanceCounter(&t1)执行是花费的震荡周期数。那么该值是多少呢?,这是我的运行结果。仅供参考。

注:t1.QuadPart的类型是long long。有的编译器支持, 有的不支持,我用的vs2008,支持。64位。

(t2.QuadPart- t1.QuadPart)/tc.QuadPart

单位为秒。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值