优化程序性能(《深入理解计算机系统》)
2017-02-22 17:00
375 查看
《深入理解计算机系统》的第5章讲的是优化程序性能,这一章看完了还是有不少收获的,现在简要的总结一下。书中总结了优化程序性能的策略,大致分为以下几类:
1. 高级设计
为问题选择合适的算法和数据结构。这块很容易理解,选择合适的数据结构,设计算法复杂度低的算法。
2. 基本编码原则
消除连续的函数引用,消除不必要的存储器引用。
消除连续的函数引用,这块好理解,每个函数(过程)的调用一方面是会带来栈帧的开销,另一方面函数里面也会有一堆指令需要执行,自然能省则省。
消除不必要的存储器引用,这块则是要理解读写存储器的速度是比较慢的,远远没有读写寄存器来得快。减少存储器的访存次数,改为使用临时中间变量(寄存器),这种做法自然也是可以提高程序的效率的。
3. 低级优化
展开循环,降低开销;通过多个累加变量和重新结合的方法,提高指令集并行;重写条件操作,使得编译采用条件传送。
这些优化思想就很偏底层了,需要结合处理器的指令集体系架构来理解。按照我粗浅的理解,这些优化措施在很大程度上都是想充分利用处理器的流水线机制。现代的处理器基本都使用了流水线机制,那么流水线机制在什么时候性能最好呢?就是各个指令都完全独立的时候,那样流水线就能满负荷的工作了。
但是实际的情形往往没有这么理想,顺序的指令之间存在数据依赖的情形。拿书中的示例来说, 对于如下的汇编代码:
假设每个指令都有取指、译码、执行、访存、回写这样5个阶段,那么按照流水线的原理。当mulss指令还在执行的时候(乘法耗的时钟周期比较长),很可能此时已经轮到下一个mulss指令来到译码阶段了。那么这里就会出问题了,下一条mulss指令需要访问xmm0寄存器的值,但是此时这个寄存器值还没有更新,是有问题的。所以下一个mulss指令不得不在流水线上继续等着,这就造成浪费了。
那么如何优化呢?一个容易想到的思路就是对算法做并行化处理,假设我是要求a1*a2*...*an,那么a1*a2跟a3*a4不冲突啊,可以并行的去执行啊。如果能让alu在算a1*a2的时候,让流水线去完成a3*a4的取值 译码,这样不就可以提高流水线的效率了!这就是算法的优化思路。
至于条件传送,那也是想提高流水线的处理效率。条件分支明显是跟流水线的思想有所冲突的:在遇到分支的时候,处理器常常会执行分支预测,但是一旦预测错了就会有惩罚。条件传送的思想是让处理器同时执行两个分支的内容,然后再选择传送哪个。
1. 高级设计
为问题选择合适的算法和数据结构。这块很容易理解,选择合适的数据结构,设计算法复杂度低的算法。
2. 基本编码原则
消除连续的函数引用,消除不必要的存储器引用。
消除连续的函数引用,这块好理解,每个函数(过程)的调用一方面是会带来栈帧的开销,另一方面函数里面也会有一堆指令需要执行,自然能省则省。
消除不必要的存储器引用,这块则是要理解读写存储器的速度是比较慢的,远远没有读写寄存器来得快。减少存储器的访存次数,改为使用临时中间变量(寄存器),这种做法自然也是可以提高程序的效率的。
3. 低级优化
展开循环,降低开销;通过多个累加变量和重新结合的方法,提高指令集并行;重写条件操作,使得编译采用条件传送。
这些优化思想就很偏底层了,需要结合处理器的指令集体系架构来理解。按照我粗浅的理解,这些优化措施在很大程度上都是想充分利用处理器的流水线机制。现代的处理器基本都使用了流水线机制,那么流水线机制在什么时候性能最好呢?就是各个指令都完全独立的时候,那样流水线就能满负荷的工作了。
但是实际的情形往往没有这么理想,顺序的指令之间存在数据依赖的情形。拿书中的示例来说, 对于如下的汇编代码:
假设每个指令都有取指、译码、执行、访存、回写这样5个阶段,那么按照流水线的原理。当mulss指令还在执行的时候(乘法耗的时钟周期比较长),很可能此时已经轮到下一个mulss指令来到译码阶段了。那么这里就会出问题了,下一条mulss指令需要访问xmm0寄存器的值,但是此时这个寄存器值还没有更新,是有问题的。所以下一个mulss指令不得不在流水线上继续等着,这就造成浪费了。
那么如何优化呢?一个容易想到的思路就是对算法做并行化处理,假设我是要求a1*a2*...*an,那么a1*a2跟a3*a4不冲突啊,可以并行的去执行啊。如果能让alu在算a1*a2的时候,让流水线去完成a3*a4的取值 译码,这样不就可以提高流水线的效率了!这就是算法的优化思路。
至于条件传送,那也是想提高流水线的处理效率。条件分支明显是跟流水线的思想有所冲突的:在遇到分支的时候,处理器常常会执行分支预测,但是一旦预测错了就会有惩罚。条件传送的思想是让处理器同时执行两个分支的内容,然后再选择传送哪个。
相关文章推荐
- 优化程序性能的几个方法(来自于《深入理解计算机系统》)
- 《深入理解计算机系统》优化程序性能
- 优化程序性能的几个方法(来自于《深入理解计算机系统》)总结
- 优化程序性能的几个方法(来自于《深入理解计算机系统》)
- 优化程序性能—《深入理解计算机系统》
- 《深入理解计算机系统》—优化程序性能
- Java程序性能和速度优化实例
- Hibernate程序性能优化的考虑要点
- [公告]博客园正在对网站程序进行性能优化
- 如何优化JAVA程序开发,提高JAVA性能?
- 程序结构和性能优化
- 总结:今天在MSN Group里面和一些朋友谈ASP.net程序的性能优化
- 总结:今天在MSN Group里面和一些朋友谈ASP.net程序的性能优化
- [python]用profile协助程序性能优化
- 总结出来的一些ASP.NET程序性能优化的注意事项[不断补充]
- asp.net程序性能优化总结
- Hibernate程序性能优化的考虑要点
- SAP ABAP程序性能优化 2
- SAP ABAP程序性能优化
- Java程序性能优化