zoukankan      html  css  js  c++  java
  • 高效编程——C++测试代码运行时间方法

    C++测试代码运行时间方法

    方法一

    最常用的执行时间测试方法,利用clock函数,精确度能达到ms级。

    直接看代码吧,这样最直观:

    #include "stdafx.h"
    #include <ctime>
    #include <vector>
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[]){
        clock_t start,finish;
        long i = 100000L;
        double duration;
        vector<long> v1;
        start = clock();
        for (;i>0;i--){
            v1.push_back(i*(i%3));
        }
        finish = clock();
        duration = (double)(finish - start)/CLOCKS_PER_SEC;
        cout<< duration << endl;
        system("pause");
        return 0;
    }

    其中,#define CLOCKS_PER_SEC 1000不同平台可能不一样,它用来表示一秒钟会有多少个时钟计时单元,clock()是以毫秒为单位,要正确输出时间差需要把它换成秒,因此需要除以CLOCKS_PER_SEC。clock()函数计算出来的是硬件滴答的数目,不是毫秒。在TC2.0中硬件每18.2个滴答是一秒,在VC++6.0中硬件每1000个滴答是一秒。

    方法二

    可以说是最高精度测试方法,但是它针对于特定的平台测试,利用QueryPerformanceFrequency和QueryPerformanceCounter函数,精确度能达到ns级。
    先看代码:

    #include "windows.h"
    #include <vector>
    #include <iostream>
    using namespace std;
    int main(int argc,char *argv[]){
            LARGE_INTEGER frequency, start, finish;
            long i = 100000L;
            vector<long> v1;
            // 获取计数器的时钟频率
            QueryPerformanceFrequency(&frequency);
            // 开始的计数
            QueryPerformanceCounter(&start);            
            for (;i>0;i--){
                v1.push_back(i*(i%3));
            }           
            //Sleep(3000); // 也可以测试睡眠1000毫秒
            //结束的计数
            QueryPerformanceCounter(&finish);           
            cout<<(double)(finish.QuadPart-start.QuadPart)/frequency.QuadPart<<endl;
    
            system("pause");
            return 0;
    }

    说明一

    QueryPerformanceFrequency和QueryPerformanceCounter()一起计算出精确时间。QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率,QueryPerformanceCounter()函数用于得到高精度计时器的值(如果存在这样的计时器),如果不支持返回值为0。

    说明二

    LARGE_INTEGER结构实际上是一个联合。如果你的编译器具有内置支持64位整数,使用QuadPart成员中存储的64位整数。否则,使用LowPart和HighPart成员的存储的64位整数。

    说明三

    LARGE_INTEGER结构

    #if defined(MIDL_PASS)
    typedef struct _LARGE_INTEGER {
    #else // MIDL_PASS
    typedef union _LARGE_INTEGER {
        struct {
            DWORD LowPart;
            LONG HighPart;
        } DUMMYSTRUCTNAME;
        struct {
            DWORD LowPart;
            LONG HighPart;
        } u;
    #endif //MIDL_PASS
        LONGLONG QuadPart;
    } LARGE_INTEGER;

    LARGE_INTEGER成员:
    LowPart 低32位。
    HighPart 高32位。
    QuadPart 有符号的64位整数。

    最后,上面的时间单位都是秒,我们其实可以将其转换成更小的单位,比如(double)(finish - start)*1000,是毫秒。(double)(finish - start)*1000000,是微妙。(double)(finish - start)*1000 000 000,是纳秒。有兴趣的可以试验下,其实两种方法测试的结果有偏差,原因就看读者怎么看了。

    生命不止,奋斗不息!
  • 相关阅读:
    MySQL explain,Extra分析(转)
    MySQL explain,type分析(转)
    HTTP报文结构和内容(转)
    linux 环境 Xshell操作数据库
    服务器线上问题排查研究
    服务性能指标:PV、UV、TPS、QPS
    Git推送错误Remote: User permission denied错误解决方法
    SQL Server表关联
    SQL Server执行计划
    C#正则Groups高级使用方法
  • 原文地址:https://www.cnblogs.com/huzongzhe/p/6735182.html
Copyright © 2011-2022 走看看