标签:分析 循环体 周期 实现 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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。