《深入理解计算机系统》优化程序性能

优化程序性能的几点:

1)高级设计。选择恰当的数据结构和算法;

2)基本编码原则:消除连续的函数调用;消除不必要的存储器引用;

3)低级优化。循环展开;提高并行性,如多个累积变量,重新结合技术,条件传送代替条件选择。

1,编译器能针对代码做一些安全性的优化;所以请遵循基本编码原则。

2,程序性能的表示:每元素的周期数(CPE)

3,实际的处理器中,是同时执行多条指令的(因为一条指令有多个阶段),即指令级并行,是乱序的。

      一个现代处理器框图,主要包括,指令控制单元和执行单元。

      延迟和发射(吞吐量)影响程序性能。低级优化,主要是做到见笑延迟界限,是程序性能只受发射界限的影响。

      如何分析程序性能?——数据流图,关键路径

      循环展开:设k表示循环展开的步数,k>2时,内部展开最好也用循环。循环展开的好处:减少循环索引计算和条件分支;进一步变化代码,减少关键路径上的操作数量。

      但是,循环展开后,编译器只能对整型计算做自动优化,来减少关键路径上的计算,(现代gcc能自动进行循环展开,要加编译参数 "-funroll-loops");浮点数计算,需要进行进一步优化,多个累加变量和重新结合变换。

4,上述一些低级优化,虽然有效,但是也有一些限制因素,如,寄存器一处,cpu寄存器数量有限,如果并行度p超过了寄存器数量,编译器就会把某些值放到栈中,引起性能下降;分支预测引起的性能下降。

5,存储器引发的程序性能。分为:加载和存储两方面。加载会直接影响程序性能 ; 存储不会直接影响,如果加载操作受存储影响,存储才会影响程序性能。

6,以上只是小型程序的分析方法,如何在大型程序中优化程序性能呢?需要进行程序剖析。unix系统提供了一个剖析工具GPROF。

      使用GPROF的方法:第一步,使用gcc时,加上运行时标志“-pg”  ; eg,gcc -O1 -pg prog.c -o prog

                                            第二步,执行那个程序prog,后面加参数file.txt ; eg,./prog file.txt

                                            第三步,调用GPROF分析程序产生文件gmon.out的数据 ; eg,gprof prog    ;会显示几个表格。

      分析原则:Amdahl定律。一个公式。。。其主要思想是,当我们加快系统一个部分的速度时,对系统整体性能的影响依赖于这个部分有多重要和速度提高了多少。所以,一个部分越重要(可以通过分析这个部分所用时间占从时间的百分比来看),速度提高的越多,系统总的效率提高的越多。


你可能感兴趣的:(《深入理解计算机系统》优化程序性能)