您的位置:首页 > 产品设计 > UI/UE

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

2012-04-20 17:29 369 查看
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

单位为秒。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息