CSAPP Chapter 5:优化程序性能 阅读笔记
大约 3 分钟
前言
写程序的主要目标是:
- 使它在所有可能的情况下都能正确的工作
- 代码清晰简洁
- 让程序运行的快*
什么是快?快”的衡量标准:
- 程序是否有实时需求
- 执行很久的程序快 20%也是非常重大的影响
因此我们需要编写高效的程序,那么编写高效程序的奥秘在于:
- 选择适当的算法和数据结构
- 编写出编译器能够有效优化以转化成高效可执行代码的程序
如何让编译器进行有效的优化呢?我们需要理解编译器的能力和优化的局限性。 - 将一个任务分成多个部分,这些部分可以在多核和多处理器的某种组合上并行的计算,让每个并行的线程都以最高效率执行。
那么我们应当如何做呢?我们必须:考虑代码使用的方式,以及影响他的关键因素,在实现简单性和速度之间做出权衡。原因有二:
- 高效的算法需要更长的时间优化
- 更大级别的优化容易带来不那么容易读的代码
提高代码性能的技术包括:
- 消除不必要的工作:
- 不依赖目标机器属性的工作包括:包括不必要的函数调用、条件测试和内存引用
- 依赖目标机器的属性的工作:我们需要了解处理器时序,因为指令在处理器中可能并行执行,或者顺序不同于他们在程序中出现的顺序 -> 我们提出了基于 Intel 和 AMD 处理器最近设计的高级模型和一种基于图形数据流(data-flow)表示法,可以使处理器对指令的执行形象化,还可以利用它预测程序的性能
- 利用处理器的指令集并行,同时执行多条指令。核心是降低一个计算的不同部分之间的数据相关,增加并行度
- 使用代码剖析程序
一种重要的方法是:
- 研究程序的汇编代码
- 识别出降低性能的属性
- 预测什么操作会并行执行:确认关键路径
总体来看,程序优化可以体现在以下几个方面:
- 程序表面:算法和数据结构的选用,消除不必要的函数调用、条件测试和内存引用
- 程序编译阶段:编译器的局限性优化
- 程序运行阶段:针对处理器时序,是否可以将其拆分为多个阶段并行执行,确认内循环关键路径
- 外部力量:使用代码剖析程序
优化编译器的能力和局限性
表示程序性能
程序示例
消除循环的低效率
减少过程调用
消除不必要的内存引用
理解现代处理器
整体操作
功能单元的性能
处理器操作的抽象模型
循环展开
提高并行性
多个累积变量
重新结合变换
优化合并代码的结果小结
一些限制因素
寄存器溢出
分支预测和预测错误处罚
理解内存性能
加载的性能
存储的性能
应用:性能提高技术
确认和消除性能瓶颈
程序剖析
使用剖析程序来指导优化
小结
赞助