ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AutoTimer类实现分析

2021-07-08 16:35:00  阅读:173  来源: 互联网

标签:分析 循环体 周期 实现 AutoTimer add 指令 执行


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。

标签:分析,循环体,周期,实现,AutoTimer,add,指令,执行
来源: https://www.cnblogs.com/BKBliulei/p/14986594.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有