优化程序性能(《深入理解计算机系统》)
来源:互联网 发布:js 刷新frame 编辑:程序博客网 时间:2024/05/22 01:55
《深入理解计算机系统》的第5章讲的是优化程序性能,这一章看完了还是有不少收获的,现在简要的总结一下。书中总结了优化程序性能的策略,大致分为以下几类:
1. 高级设计
为问题选择合适的算法和数据结构。这块很容易理解,选择合适的数据结构,设计算法复杂度低的算法。
2. 基本编码原则
消除连续的函数引用,消除不必要的存储器引用。
消除连续的函数引用,这块好理解,每个函数(过程)的调用一方面是会带来栈帧的开销,另一方面函数里面也会有一堆指令需要执行,自然能省则省。
消除不必要的存储器引用,这块则是要理解读写存储器的速度是比较慢的,远远没有读写寄存器来得快。减少存储器的访存次数,改为使用临时中间变量(寄存器),这种做法自然也是可以提高程序的效率的。
3. 低级优化
展开循环,降低开销;通过多个累加变量和重新结合的方法,提高指令集并行;重写条件操作,使得编译采用条件传送。
这些优化思想就很偏底层了,需要结合处理器的指令集体系架构来理解。按照我粗浅的理解,这些优化措施在很大程度上都是想充分利用处理器的流水线机制。现代的处理器基本都使用了流水线机制,那么流水线机制在什么时候性能最好呢?就是各个指令都完全独立的时候,那样流水线就能满负荷的工作了。
但是实际的情形往往没有这么理想,顺序的指令之间存在数据依赖的情形。拿书中的示例来说, 对于如下的汇编代码:
假设每个指令都有取指、译码、执行、访存、回写这样5个阶段,那么按照流水线的原理。当mulss指令还在执行的时候(乘法耗的时钟周期比较长),很可能此时已经轮到下一个mulss指令来到译码阶段了。那么这里就会出问题了,下一条mulss指令需要访问xmm0寄存器的值,但是此时这个寄存器值还没有更新,是有问题的。所以下一个mulss指令不得不在流水线上继续等着,这就造成浪费了。
那么如何优化呢?一个容易想到的思路就是对算法做并行化处理,假设我是要求a1*a2*...*an,那么a1*a2跟a3*a4不冲突啊,可以并行的去执行啊。如果能让alu在算a1*a2的时候,让流水线去完成a3*a4的取值 译码,这样不就可以提高流水线的效率了!这就是算法的优化思路。
至于条件传送,那也是想提高流水线的处理效率。条件分支明显是跟流水线的思想有所冲突的:在遇到分支的时候,处理器常常会执行分支预测,但是一旦预测错了就会有惩罚。条件传送的思想是让处理器同时执行两个分支的内容,然后再选择传送哪个。
- 优化程序性能(《深入理解计算机系统》)
- 深入理解计算机系统:优化程序性能
- 《深入理解计算机系统》优化程序性能
- 程序性能优化-深入理解计算机系统
- 优化程序性能—《深入理解计算机系统》
- 深入理解计算机系统:优化程序性能
- 深入理解计算机系统--优化程序性能
- 《深入理解计算机系统》—优化程序性能
- 深入理解计算机系统之旅(五)优化程序性能
- 优化程序性能 计算机系统结构 深入理解计算机系统
- 深入理解计算机系统阅读笔记-优化程序性能
- 深入理解计算机系统 perflab 程序性能优化实验
- [读书笔记]深入理解计算机系统 第6章 优化程序性能
- 优化程序性能的几个方法(来自于《深入理解计算机系统》)
- 优化程序性能的几个方法(来自于《深入理解计算机系统》)总结
- 深入理解计算机系统学习笔记(二)之程序优化
- 《深入理解计算机系统》读书笔记--程序编译优化
- cs app深入理解计算机系统:第五章 优化程序性能 几个优化的java实现
- 【Maven in action】解决办法:Could not get the value for parameter encoding for plugin execution...
- 【Zookeeper】源码分析之请求处理链(二)
- CSS开发工具---持续更新
- PAT乙级1063 计算谱半径
- 关于URI和URL
- 优化程序性能(《深入理解计算机系统》)
- 资源共享
- Anaconda 安装Dlib
- LeetCode-172. Factorial Trailing Zeroes
- Tomcat下使用war包发布项目
- Storm 进阶(集群)
- 在mybatis执行SQL语句之前进行拦截处理
- 【技术】C#入门:Trim()、TrimStart()、TrimEnd()的用法
- TCP与UDP的区别