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
单位为秒。