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;
    }

    分享到: