AutoTimer类实现分析

RAII 机制

Resource Acquisition Is Initialization 机制 --- 对象析构函数时释放资源, 该机制好处 :

  • 保证资源正常释放
  • 规避冗长的异常处理逻辑,保证代码异常安全
  • 简化代码体积

AutoTimer类设计

  • 构造函数中记录任务开始时间点
  • 析构函数中记录任务结束时间点, 计算时间间隔输出
#include <iostream>
#include <chrono>

class AutoTimer {
public:
    AutoTimer() {
        _start = std::chrono::high_resolution_clock::now();
    }
    ~AutoTimer() {
        auto end = std::chrono::high_resolution_clock::now();
        std::cout <<"time used : " << std::chrono::duration_cast<std::chrono::milliseconds>(end - _start).count()
            << " ms" << std::endl;
    }
private:
    std::chrono::time_point<std::chrono::high_resolution_clock> _start;
};

int main() {
    {
        AutoTimer ts;
        int sum = 0;
        for(int i = 0 ; i < 100000000; i++) {
            sum +=i;
        }
        std::cout << " current sum : " << sum << std::endl;
    }
    return 0;
}

执行结果 269ms

 current sum : 887459712
time used : 269 ms

执行循环体时间损耗分析:
cat /proc/cpuinfo | grep CPU
CPU 主频 f = 2.4GHz

下图,反汇编看到循环体执行指令 是 , 1个mov 2个add 共3条指令
add mov执行指令周期是一个时钟周期,
如果是乘法指令或者转移指令的执行周期可能是两个或者两个以上的时钟周期

  2a:	7f 0c                	jg     38 <main+0x38>
  2c:	8b 45 e8             	mov    -0x18(%rbp),%eax
  2f:	01 45 ec             	add    %eax,-0x14(%rbp)
  32:	83 45 e8 01          	addl   $0x1,-0x18(%rbp)
  36:	eb eb                	jmp    23 <main+0x23>

总的指令周期 = 取指周期 + 执行指令周期 = 2 * 时钟周期
循环体执行总次数 10000000 次
总时间损耗 T = 10000000 * 3 * 2 * 1/(2.4*1000000000) s= 1/4 s = 250 ms

总结 :
AutoTimer 可以配合块作用域使用,离开块作用域时对象析构。输出计时时间。
程序编译没有使用-O优化选项,使用编译优化项指令会重排,多核环境利用起来时间可以缩短到20ms。

posted @ 2021-07-08 16:12  灰烬之灵js  阅读(126)  评论(0)    收藏  举报