• 计算程序运行时间的封装


    只能在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  执行后就会输出函数消耗时间

  • 相关阅读:
    原生JS实现无缝轮播
    原生JS模拟百度搜索框
    2016年终总结:一份来自跨界喜剧人的告白
    PHP学习笔记
    html5吹牛扯淡篇,闲话内容。
    html5+css3+jquery完成响应式布局
    jquery的animate({})动画整理
    函数的使用和选择
    jquery函数理解与运用
    老生长谈的$.extend()方法
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/3300944.html
Copyright © 2020-2023  润新知