CSAPP第五章 总结

本章节分为两个部分,第一个部分是在性能优化上对于所有的及其的共同考虑
第二个部分就是对于一种理想的机器类型:X86进行对用优化操作
5.1:
编译器会为我们做大部分的工作,但是由于一起可能含有不确定性的操作,编译器不敢为我们进行优化,导致了低效率
5.2:
测试程序性能的标准:CPE计算机运行这个程序需要多少周期
计算方式:实际时间/计算机每周期的时间
5.3:
gcc的不同优化级别-O1 -O2也会导致时间不相同(和)
5.4:
如果循环的判断条件是一个复杂度为O(n)甚至更高的函数,那么需要使用一个临时变量去存储这个函数值,作为判断的条件。有的时候为了减少函数调用的开销,O(1)的函数也被鼓励这种操作
5.5:
减少函数的调用,尤其是长度只有一行到两行的函数,在大量调用这种函数的前提下,通过直接将这个函数写在主题中,从而通过破坏程序的模块性来实现程序性能的提升
5.6:
取出内存中储存的值,和写入内存中的值都是一项很耗费时间的操作
一个经常访问的内存地址,或者对于一个短时间内进行了大量更改的内存地址,我们可以向将其读取到当地变量:也就是寄存器中,之后再进行后续操作

之后我们进入第二部分(通过X86的特殊实现机制,我们来针对这一种类型的机器来进行优化)

/重点在第二部分/

5.7:
学会画基于汇编语言的数据流图
数据流图中关键路径的长度决定了函数的快慢
5.8:
简单的循环展开
5.9:
通过多个变量积累(循环展开的进阶形式)
和重新结合变量来提高程序的速度(使得内存取到寄存器中的操作同时进行)
5.11:
限制因素:
寄存器不够用,导致5.11中的优化无法实现
处理分治预测的时候,尽量写计算机可预测的分支(计算机预测分支是根据函数执行的历史来预测的)
在处理不可预测的分支的时候,尽量手动用C语言实现类似conditional move 而不是jump操作

5.12
理解内存:
其实就是理解系统数据的传输以及Cache寄存器的运行机理

猜你喜欢

转载自blog.csdn.net/weixin_42222917/article/details/85093568