C++统计精确时间
QueryPerformanceFrequency用法精确获取时间:QueryPerformanceFrequency()-基本介绍类型:Win32API原型:BOOLQueryPerformanceFrequency(LARGE_INTEGER*lpFrequency);作用:返回硬件支持的高精度计数器的频率。返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。QueryPerformanceFrequency()-技术特点供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。需包含windows.h头文件。函数的原形是:BOOLQueryPerformanceFrequency(LARGE_INTEGER*lpFrequency);BOOLQueryPerformanceCounter(LARGE_INTEGER*lpCount);数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:typeefunion_LARGE_INTEGER{struct{DWORDLowPart;LONGHighPart;};LONGLONGQuadPart;}LARGE_INTEGER;在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。测试Sleep的精确时间:#include<stdio.h>#include<windows.h>voidmain(){LARGE_INTEGERnFreq;LARGE_INTEGERnBeginTime;LARGE_INTEGERnEndTime;doubletime;QueryPerformanceFrequency(&nFreq);QueryPerformanceCounter(&nBeginTime);Sleep(1000);QueryPerformanceCounter(&nEndTime);time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;printf("%f\n",time);Sleep(1000);system("Pause");}再给出我写的一个Fibonacci的例子:#include<iostream>#include<cmath>#include<ctime>#include<windows.h>#include<iomanip>usingnamespacestd;unsignedlongFib1(unsignedlongn){return(n==1||n==2)?1:Fib1(n-1)+Fib1(n-2);}unsignedlongFib2(unsignedlongn){if(n==1||n==2){return1;}unsignedlongm1=1,m2=1;for(unsignedlongi=3;i<=n;i++){m2=m1+m2;m1=m2-m1;}returnm2;}intmain(){LARGE_INTEGERnFreq;LARGE_INTEGERnBeginTime;LARGE_INTEGERnEndTime;doubletime1=0,time2=0;unsignedlongresult1=0;unsignedlongresult2=0;unsignedlongfib_num=45;cout.precision(10);cout.setf(cout.showpoint);//设置为始终输出小数点后的数字,就是说a=3,它也输出3.00000这QueryPerformanceFrequency(&nFreq);QueryPerformanceCounter(&nBeginTime);result1=Fib1(fib_num);QueryPerformanceCounter(&nEndTime);time1=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;cout<<"Fib1:"<<fixed<<setprecision(8)<<setiosflags(ios::showpoint)<<time1<<endl;QueryPerformanceFrequency(&nFreq);QueryPerformanceCounter(&nBeginTime);result2=Fib2(fib_num);QueryPerformanceCounter(&nEndTime);time2=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;cout<<"Fib2:"<<fixed<<setprecision(20)<<setiosflags(ios::showpoint)<<time2<<endl;cout<<"Fib2cost"<<time2*(unsignedlong)100/time1<<"%timeofFib1."<<endl;//cout<<"Helloworld!"<<endl;return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。