-
C++法度运行时候
添加时间:2013-6-6 点击量:在C++法度的机能解析中,此中首要的一项就是法度的运行时候。固然法度的运行速度与策画机的设备、策画机的当前状况等有很大关系,但在相对一致的外部景象下,法度运行时候的长短在很大程度上是可以反应法度效力的。
1.一般计时办法
在ctime头文件中,C++供给了计时函数 clock() ,其返回数据类型为 clock_t。
typedef long clock_t;
clock()函数返回从“开启法度过程”到“法度中调用clock()函数”这段时候里,CPU时钟计时单位(clock tick)的数量,在MSDN中称之为挂钟时候(wal-clock)。
在ctime文件中,还定义了一个常量CLOCKS_PER_SEC,它用来默示一秒内有几许个CPU时钟计时单位。
经由过程clock()/CLOCKS_PER_SEC便可以获得过程的运行时候,一般CLOCKS_PER_SEC的值为1000,可见计时精度可达小数点后3位(毫秒级)。
#define CLK_TCK CLOCKS_PER_SEC
计时的简单示例如下
/
作者:侯凯
申明:clock()计时函数
日期:2013-6-6
/
#include <ctime> //计时用的头文件
#include <iostream>
using namespace std;
int main()
{
long i = 10000000L;
clock_t start, end;
start = clock();
while( i-- );//须要计时的法度段
end = clock();
printf("The time was: %f\n", (double)(end - start) / CLK_TCK);
system("pause");
return 0;
}
2.正确计时办法
这里正确的含义是计时的精度更高,为了达到更高的计时精度,须要应用正确时候函数QueryPerformanceCounter()和QueryPerformanceFrequency(),它们须要策画机从硬件上支撑正确按时器。当然,如今策画机一般都是支撑的。
QueryPerformanceCounter()函数返回高正确度计数器的脉冲数量(计时数),QueryPerformanceFrequency()函数供给了高精度计时器的频率值,即每秒脉冲数。
bool QueryPerformanceFrequency (LARGE_INTEGER lpFrequency);
bool QueryPerformanceCounter (LARGE_INTEGER lpCount);
此中,数据类型LARGE_INTEGER既可所以一个8字节长的整型数,也可所以两个4字节长的整型数的结合布局, 其具体用法按照编译器是否支撑64位而定。该类型的定义如下:
typedef union _LARGE_INTEGER
{
struct
{
DWORD LowPart ;// 4字节整型数
LONG HighPart;// 4字节整型数
};
LONGLONG QuadPart ;// 8字节整型数
}LARGE_INTEGER ;
在进行按时之前,先调用QueryPerformanceFrequency()函数获得机械内部按时器的时钟频率,然后在须要严格按时的事务产生之前和产生之后分别调用QueryPerformanceCounter()函数,哄骗两次获得的计数之差及时钟频率,策画出事务经验的正确时候。其过程与clock()办法类似,但这里的时钟频率很高,测试电脑上频率的QuadPart值为3118031,其精度原高于clocK()。
为了更好地应用这种计时体式格式,已将其封装成HpTime类,。应用该类,计时法度如下
/
作者:侯凯
申明:HpTime类高精度计时
日期:2013-6-6
/
#include "hptime.h"
#include <iostream>
using namespace std;
int main()
{
long i = 10000000L;
HpTime hpTime;
while( i-- );//要计时的函数段
printf("The time was: %f\n", hpTime.sec());
system("pause");
return 0;
}