zoukankan      html  css  js  c++  java
  • 计算程序运行时间的封装

    只能在linux下使用:

    #include <sys/time.h>
    
    class timer
    {
        public:
            timer(int _timerType = CLOCK_PROCESS_CPUTIME_ID) : timerType(_timerType)
            {
                clock_gettime(timerType, &begin);
            }
            long elapsed() const
            {
                timespec end;
                clock_gettime(timerType, &end);
                timespec temp;
                if ((end.tv_nsec-begin.tv_nsec)<0) {
                    temp.tv_sec = end.tv_sec-begin.tv_sec-1;
                    temp.tv_nsec = 1000000000+end.tv_nsec-begin.tv_nsec;
                } else {
                    temp.tv_sec = end.tv_sec-begin.tv_sec;
                    temp.tv_nsec = end.tv_nsec-begin.tv_nsec;
                }
                return temp.tv_sec*1000*1000*1000 + temp.tv_nsec;
            }
            void restart()
            {
                 clock_gettime(timerType, &begin);
            }
        private:
            timespec begin;
            int timerType;
    };

    链接时需要 -lrt

    使用如下:

    timer t;
    int *pi = new int;
    std::cout<<t.elapsed()<<std::endl;
    
    t.restart();
    char *pc = new char[3];
    std::cout<<t.elapsed()<<std::endl;

    测试函数输出时间:

    #include <sys/time.h>
    #include <string>
    #include <iostream>
    
    class scoped_timer
    {
        public:
            scoped_timer(std::string _funName = "", int _timerType = CLOCK_PROCESS_CPUTIME_ID) : funName(_funName),timerType(_timerType)
            {
                clock_gettime(timerType, &begin);
            }
            ~scoped_timer()
            {
                std::cout<<funName<<" : "<<elapsed()<<"(ms)"<<std::endl;  //这里也可以输出到文件
            }
            private:
                long elapsed() const
                {
                    timespec end;
                    clock_gettime(timerType, &end);
                    timespec temp;
                    if ((end.tv_nsec-begin.tv_nsec)<0) {
                        temp.tv_sec = end.tv_sec-begin.tv_sec-1;
                        temp.tv_nsec = 1000000000+end.tv_nsec-begin.tv_nsec;
                    } else {
                        temp.tv_sec = end.tv_sec-begin.tv_sec;
                        temp.tv_nsec = end.tv_nsec-begin.tv_nsec;
                    }
                    return temp.tv_sec*1000*1000*1000 + temp.tv_nsec;
                }
        private:
            timespec begin;
            int timerType;
            std::string funName;
    };
    #ifdef DEBUG
    #define funTime(funname) scoped_timer t(funname);
    #else
    #define funTime(funname)
    #endif

    测试程序如下:

    void fun()
    {
        funTime("fun()");
        for(int i = 0; i < 1000000; i++)
            int *pi = new int;
    }

    编译时使用:g++ test6.cpp -o test6 -lrt -DDEBUG  执行后就会输出函数消耗时间

  • 相关阅读:
    洛谷 P1578 奶牛浴场 题解
    LOJ167 康托展开 题解
    三校联训 【NOIP模拟】寻找
    洛谷 P1809 过河问题 题解
    有关多边形面积的总结
    LOJ 103 字串查找 题解
    洛谷 P2384 最短路 题解
    POJ 2492 A Bug's Life 题解
    LOJ 10214 计算器 题解
    洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题解
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/3300944.html
Copyright © 2011-2022 走看看